一.MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.
二.MyBatis 与Spring Data JPA对比
- 持久层框架Spring Data JPA相比Mybatis,开发效率比较高,hibernate能方便、自动化更强,而MyBatis 在Sql语句编写方面则更灵活自由,具体在以下几点:
- JPA默认使用hibernate作为ORM实现,所以,一般使用Spring Data JPA即会使用hibernate。我们再看看hibernate的官方概念,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
- 从框架的设计理念上来看,hibernate是一种面向对象,全自动的orm框架,hibernate 是我们不用关注数据库,而需要去关注代码本身,通过操作映射表的实体对象,一定程度上简化了开发,提高了开发效率,而mybatis 是一种半自动的orm框架,使用时需要自己写sql语句,在我看来,项目中太多的sql语句,反而不如直接的实体对象操作更清晰明了
- 从表关联上看,有人说hibernate的多表关联是一大弊病,hibernate 本身并没有提供实体类多表关联的方法 ,而如果通过manytoOne之类的实体类设计又会产生效率问题,但其实现在已经有了很好的解决方案,通过整合queryDSL就可以很方便地对表对象进行关联查询,这样其实mybatis 的灵活sql优势其实也没有那么的明显
- 从表,表字段映射上看,hibernate 直接通过框架生成表,表字段,能够更方便地对数据库的表进行维护,而mybatis 建表更新表都需要写sql语句,又需要花费精力去维护这样的sql语句,sql语句查询出来的数据又要通过resultMap 进行映射,没有hibernate方便
- 从性能上看,如果只是内部系统,用户量较小的系统,两个框架其实性能上差距不会太明显,这个时候推荐使用Spring Data JPA开发效率反而会更高,但是如果是互联网项目,app接口之类的项目,为了追求极致的性能,还是应该对两个框架的利弊进行取舍了
三.springboot集成MyBatis
步骤(此处仅实现一个简单的查询功能,详细CRUD功能后见源代码)
1新建springboot项目 只加web 和数据库依赖即可,maven集成项目(gradle也可以)
2. 在pom.xml中引入mybatis支持 Maven reimport
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
导入后即可看到项目中已加入了mybatis的依赖
3. 配置application.yml
将项目中的application.propertites修改为.yml文件
server:
port: 8000
#datasource
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/scott
username: postgres
password: postgres
#format json
jackson:
serialization:
indent-output: true
#mybatis
mybatis:
config-location: classpath:/mybatis/mybatis-config.xml #core config file 核心配置文件
mapper-locations: classpath:/mybatis/mapper/*.xml
#show sql
logging:
level:
com:
zoe:
mybatis:
mapper: debug
增加数据库和mybatis等配置
4 生成mybatis 核心配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
位置在resourse下,如图
5.新建/mybatis/mapper/包结构
6.新建Java类 Emp
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Float sal;
private Float comm;
private Integer deptno;
//getter setter此处省略
}
7. 新建EmpMapper
import com.zoe.mybatis.entity.Emp;
public interface EmpMapper {
public Emp findById(Integer empno);
}
8. 新建emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 映射文件接口 namespace指向接口-->
<mapper namespace="com.zoe.mybatis.mapper.EmpMapper">
<!-- id 指向方法名要一致-->
<select id="findById" parameterType="Integer" resultType="com.zoe.mybatis.entity.Emp">
select * from emp where empno = #{value}
</select>
</mapper>
9.新建EmpService
@Service
public class EmpService {
@Resource
EmpMapper empMapper = null;
public Emp findById(Integer empno){
Emp emp = empMapper.findById(empno);
return emp;
}
}
10.新建EmpController
@RestController
public class EmpController {
@Autowired
private EmpService empService=null;
@RequestMapping("/emp/{id}")
public Emp findById(@PathVariable("id") Integer id){
return empService.findById(id);
}
}
11.在application中新增@MapperScan扫描注解
@SpringBootApplication
//MapperScan 在springboot启动的时后自动扫描mapper,并根据xml自动生成对应的实现
@MapperScan("com.zoe.mapper")
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
12.运行测试
四、特殊重点
1.PostgreSQL使用MyBatis,insert时返回主键
useGeneratedKeys="true" keyProperty="主键名称"
<!-- selectKey 将id 回填 keyProperty主键名 keyColumn=属性名 -->
<insert id="creates" parameterType="com.zoe.mybatis.entity.Emp" useGeneratedKeys="true" keyProperty="empno">
INSERT INTO "public"."emp"( "comm", "ename", "hiredate", "job", "mgr", "sal", "deptno")
VALUES (#{comm}, #{ename}, #{hiredate}, #{job}, #{mgr}, #{sal}, #{deptno});
</insert>
2.mysql主键返回
LAST_INSERT_ID()是mysql的内置方法
<!-- selectKey 将id 回填 keyProperty主键名 keyColumn=属性名 -->
<insert id="creates" parameterType="com.zoe.mybatis.entity.Emp" >
INSERT INTO "public"."emp"( "comm", "ename", "hiredate", "job", "mgr", "sal", "deptno")
VALUES (#{comm}, #{ename}, #{hiredate}, #{job}, #{mgr}, #{sal}, #{deptno});
<selectKey keyProperty="empno" keyColumn="empno" resultType="Integer" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
五、源码
springboot+mybatis+postgresql+maven 增删改查示例代码
源码地址 https://github.com/bitree1/mybatis
git地址:https://github.com/bitree1/mybatis.git
关注
如果有问题,请在下方评论
想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码