Spring Boot(十一):Spring Boot 整合 MyBatis

1,811 阅读3分钟

前言:在项目启动的时候,Spring Boot Starter 会根据约定信息对组件进行加载、初始化。因此项目中引入了对于的 Starter 之后,就可以到达开箱即用的效果。所以 mybatis-spring-boot-starter 可以帮助你快速构建一个基于 Spring Boot 的 MyBatis 应用程序。

⭐接下来带你快速上手在 Spring Boot 项目中集成 MyBatis!

将以下依赖导入到 pom.xml 文件中:

<!-- MyBatis Integration With Spring Boot -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<!-- @Data、@ToString -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

<!-- 提供 mysql 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

<!-- log4j 打印 SQL 执行日志、.yml 中配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>

注意:该依赖是由 MyBatis 官方整合 Spring Boot 并提供的,而非 Spring Boot 官方整合 MyBatis,所以 <version> 版本号不能省去!

众所周知,MyBatis 有两大核心组件:SqlSessionFactoryMapper 接口。前者用于数据库连接,后者用于 SQL 映射。当我们基于 Spring 使用 MyBatis 时,也同样要保证在 Spring 环境中能存在着这两大组件。

而引入 mybatis-spring-boot-starter 依赖后,它会自动完成如下任务:

  1. 自动检测已存在的 DataSource
  2. 利用 SqlSessionFactoryBean 创建并注册 SqlSessionFactory
  3. 创建并注册 SqlSessionTemplate 实例
  4. 自动扫描 Mappers 接口,并将其注册到 Spring 上下文环境中方便注入使用

假设 mysql 数据库中有如下 sys_user 表:

FieldTypeComment
id🔑bigint(20) NOT NULL用户 ID
usernamevarchar(50) NULL用户名
emailvarchar(50) NULL邮箱
passwordvarchar(80) NULL密码
phoneNumvarchar(20) NULL电话号码

创建 User 实体类

注:此处实体类名 User 与数据库中的 sys_user 表名不匹配从而导致无法自动映射,需要在编写 UserMapper.xml 时通过 resultType 属性进行手动映射;phonephoneNum 则是通过 Select 语句中的 AS 命别名进行映射。

@Data
@ToString
public class User {
    private int id;
    private String username;
    private String email;
    private String password;
    private String phone;

}

Mapper 接口:

@Mapper
public interface UserMapper {
    List<User> selectAllUsers();
}

🧠如果拥有多个 @Mapper 后,逐一进行注解有点麻烦,这时可以使用 @MapperScan(basePackages = "com.wyk.mybatis.dao") 进行替代(@Mapper 就可以不使用了)

@Configuration
@MapperScan(basePackages = "com.wyk.mybatis.dao")
public class MyBatisConfiguration {
}

至于 SQL 语句,我们可以采用注解XML 配置文件的方式进行编写,这里使用 XML 配置文件进行演示:

前置:在 resource 目录下新建 com/wyk/mybatis/mapper/UserMapper.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">
<mapper namespace="com.wyk.mybatis.dao.UserMapper">

    <select id="selectAllUsers" resultType="user">
        -- phoneNum As phone: 字段名不一致的映射处理
        select id, username, email, password, phoneNum AS phone
        -- 表名不一致的映射处理
        from sys_user;
    </select>

</mapper>

SQL 映射都基本配置好了,但数据库还没连接,于是在 application.yml 中进行相关配置。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
mybatis:
  # 实体类别名---包路径
  type-aliases-package: com.wyk.mybatis.entity
  # 映射文件位置
  mapper-locations: classpath*:com/wyk/mybatis/mapper/*Mapper.xml
  configuration:
    # 使用日志打印 SQL 语句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

OK!接下来在测试类中进行测试:

@SpringBootTest
class MybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        List<User> users = userMapper.selectAllUsers();
        users.forEach(System.out::println);
    }

}

运行结果

🤨Spring Boot 集成 MyBatis 的基本操作就演示到这,更多操作与配置请查阅官方文档