目前比较流程的 ORM 框架有 Hibernate、Spring Data JPA、Mybatis(半 ORM 框架)。
对于 Spring Data JPA 框架,Spring 基于 JPA 规范进行实现,对 JDBC 进行了高度的封装,不怎么需要开发人员进行 SQL 语句的编写,可以说使用 Spring Data JPA 进行数据库相关的开发工作效率是最高的。
对于 Hibernate 笔者没有过多的接触,只是听到各种传言说 Hibernate 这个框架比较重,内含的一级缓存、二级缓存、HQL 知识点过多,及项目上没有直接使用过 Hibernate 进行实现,所以没有作过多的研究学习。
Mybatis 是一个轻量级的半 ORM 框架,之所以这样说是因为 Mybatis 只进行了部分封装,所有的 SQL 语句都需要研发人员进行编写。
https://mybatis.org/mybatis-3/zh/index.html
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
运行环境:Win10 + Jdk1.8 + Maven3 + Intellij IDEA 2020 + mysql5.7 + Mybatis3
1、示例代码地址
https://gitee.com/lif/study-mybatis/tree/master
2、目录结构如下
4.0.0
com.ddpyjqtd
simple-mybatis
1.0-SNAPSHOT
simple-mybatis
UTF-8
1.8
1.8
org.projectlombok
lombok
1.18.10
provided
org.mybatis
mybatis
3.5.4
mysql
mysql-connector-java
8.0.20
org.slf4j
slf4j-api
1.7.30
org.apache.logging.log4j
log4j-slf4j-impl
2.13.3
test
org.apache.logging.log4j
log4j-api
2.13.3
org.apache.logging.log4j
log4j-core
2.13.3
junit
junit
4.11
test
4、增加 model 类: Demo.java
package com.ddpyjqtd.demo.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Date;
/***
* 测试表对应的demo类
*
* @author ddpyjqtd
* @date 2020/5/22 16:30
*/
@Getter
@Setter
@ToString
public class Demo {
/**
* int 类型字段
*/
private int demoInt;
/**
* String 类型字段
*/
private String demoVarchar;
/**
* text 类型字段
*/
private String demoText;
/**
* datetime 类型字段
*/
private Date demoDateTime;
}
5、增加数据库配置文件:db.properties,内容如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username=root
password=root
6、增加日志配置文件 log4j2.xml,内容如下:
d://logs
simple-mybatis
${file_path}/${project_name}.log
${file_path}/${project_name}-sql.log
${file_path}/${project_name}-error.log
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{36} %L %M - %m%n
7、增加 Mybatis 配置文件 mybatis-config.xml,内容如下:
8、增加数据库配置文件读取工具类:DbUtils.java,内容如下:
package com.ddpyjqtd.demo.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
/**
* @description: 处理数据库连接相关事项
* @author: ddpyjqtd
* @date: 2020/5/22 18:13
*/
@Slf4j
public class DbUtils {
private DbUtils() {
}
private static SqlSessionFactory factory;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
} catch (IOException e) {
log.error("SqlSessionFactory create Error : ", e);
}
}
/**
* 获取 SqlSession 实例对象
*
* @return org.apache.ibatis.session.SqlSession
* @author ddpyjqtd
* @date 2020/5/22 18:28
*/
public static SqlSession getSqlSession() {
return factory.openSession();
}
/**
* 关闭SqlSession
*
* @param sqlSession 会话对象
* @author ddpyjqtd
* @date 2020/5/24 21:51
*/
public static void closeSqlSession(SqlSession sqlSession) {
if (sqlSession == null) {
return;
}
sqlSession.close();
}
}
9、编写数据库操作接口:DemoMapper.java,内容如下:
package com.ddpyjqtd.demo.dao;
import com.ddpyjqtd.demo.model.Demo;
/**
* 数据库映射接口
*
* @author ddpyjqtd
* @date 2020/5/22 18:04
*/
public interface DemoMapper {
/**
* 通过ID查询Demo对象信息
*
* @param demoInt 主键ID
* @return com.ddpyjqtd.demo.model.Demo
* @author ddpyjqtd
* @date 2020/5/24 22:22
*/
Demo findDemoById(int demoInt);
}
10、 编写 Service 类:DemoService.java,内容如下:
package com.ddpyjqtd.demo.service;
import com.ddpyjqtd.demo.dao.DemoMapper;
import com.ddpyjqtd.demo.model.Demo;
import com.ddpyjqtd.demo.utils.DbUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;
/**
* 示例类Service
*
* @author ddpyjqtd
* @date 2020/5/22 18:26
*/
@Slf4j
public class DemoService {
/**
* 通过ID获取对应的示例对象
*
* @param demoInt 主键ID
* @return com.ddpyjqtd.demo.model.Demo
* @author ddpyjqtd
* @date 2020/5/24 22:28
*/
public Demo findDemoByKey(int demoInt) {
SqlSession session = DbUtils.getSqlSession();
DemoMapper demoMapper = session.getMapper(DemoMapper.class);
Demo demo = demoMapper.findDemoById(demoInt);
if (demo != null) {
log.info("demo info is : {}", demo);
}
DbUtils.closeSqlSession(session);
return demo;
}
}
11、编写 Mybatis 映射器文件:DemoMapper.xml,内容如下:
12、执行 SQL
CREATE TABLE demo (
demo_int int(255) NOT NULL COMMENT 'int 类型字段',
demo_varchar varchar(255) NULL DEFAULT NULL COMMENT 'String 类型字段',
demo_text text NULL COMMENT 'text 类型字段',
demo_date_time datetime(0) NULL DEFAULT NULL COMMENT 'datetime 类型字段',
PRIMARY KEY (demo_int) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '示例表,各个字段为数据库的各种类型' ROW_FORMAT = Dynamic;
insert into demo (demo_int, demo_varchar, demo_text, demo_date_time)
VALUES (1, 'this is demo_varchar', 'this is demo_text', now());
13、编写测试类:TestDemoService.java,内容如下:
package com.ddpyjqtd.demo;
import com.ddpyjqtd.demo.model.Demo;
import com.ddpyjqtd.demo.service.DemoService;
import org.junit.Assert;
import org.junit.Test;
import java.util.Date;
/**
* 测试service
*
* @author ddpyjqtd
* @date 2020/5/22 18:31
*/
public class TestDemoService {
@Test
public void findDemoByKey() {
DemoService service = new DemoService();
Demo demo = service.findDemoByKey(1);
Assert.assertNotNull(demo);
}
}
14、运行测试类,执行结果如下:
2020-06-14 21:19:40.346 DEBUG com.ddpyjqtd.demo.dao.DemoMapper.findDemoById 143 debug - ==> Preparing: select * from demo where demo_int = ?
2020-06-14 21:19:40.392 DEBUG com.ddpyjqtd.demo.dao.DemoMapper.findDemoById 143 debug - ==> Parameters: 1(Integer)
2020-06-14 21:19:40.427 DEBUG com.ddpyjqtd.demo.dao.DemoMapper.findDemoById 143 debug - <== Total: 1
2020-06-14 21:19:40.431 INFO com.ddpyjqtd.demo.service.DemoService 31 findDemoByKey - demo info is : Demo(demoInt=1, demoVarchar=this is demo_varchar, demoText=this is demo_text, demoDateTime=Sat Jun 06 06:37:37 CST 2020)
Process finished with exit code 0