Spring Boot 专题系列四:Springboot 集成MyBatis

一.MyBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.

二.MyBatis 与Spring Data JPA对比

  1.  持久层框架Spring Data JPA相比Mybatis,开发效率比较高,hibernate能方便、自动化更强,而MyBatis 在Sql语句编写方面则更灵活自由,具体在以下几点:
  2. JPA默认使用hibernate作为ORM实现,所以,一般使用Spring Data JPA即会使用hibernate。我们再看看hibernate的官方概念,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
  3. 从框架的设计理念上来看,hibernate是一种面向对象,全自动的orm框架,hibernate 是我们不用关注数据库,而需要去关注代码本身,通过操作映射表的实体对象,一定程度上简化了开发,提高了开发效率,而mybatis 是一种半自动的orm框架,使用时需要自己写sql语句,在我看来,项目中太多的sql语句,反而不如直接的实体对象操作更清晰明了
  4. 从表关联上看,有人说hibernate的多表关联是一大弊病,hibernate 本身并没有提供实体类多表关联的方法 ,而如果通过manytoOne之类的实体类设计又会产生效率问题,但其实现在已经有了很好的解决方案,通过整合queryDSL就可以很方便地对表对象进行关联查询,这样其实mybatis 的灵活sql优势其实也没有那么的明显
  5. 从表,表字段映射上看,hibernate 直接通过框架生成表,表字段,能够更方便地对数据库的表进行维护,而mybatis 建表更新表都需要写sql语句,又需要花费精力去维护这样的sql语句,sql语句查询出来的数据又要通过resultMap 进行映射,没有hibernate方便
  6.  从性能上看,如果只是内部系统,用户量较小的系统,两个框架其实性能上差距不会太明显,这个时候推荐使用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等配置

生成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

 

关注

如果有问题,请在下方评论

想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值