Spring Boot 整合 Mybatis 非常简单,只需在项目中引入数据库连接依赖mybatis-spring-boot-starter 即可。

<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

1. Mybatis 依赖说明


image.png

注意上图中红框标识出的内容,可见 mybatis-spring-boot-starter 中包含了 spring-boot-starter-jdbc 相关依赖。HikariCP 先做个认识,马上会介绍到。

2. DataSource 配置


spring:
  datasource:
    type: com.mysql.cj.jdbc.MysqlDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: demo
    password: demo

配置说明:

  • type:数据源类型,即指定数据库类型,这里为 mysql
  • driver-class-name:数据库驱动,对应 type 中的数据源类型
  • url:数据库连接地址
  • username:数据库连接用户名
  • password:数据库连接密码

配置完这些后我们就可以在项目中使用 Mybatis 了。

3. 数据库连接池

我们知道系统资源是有限的,如 线程资源,还有数据库连接资源。为了不重复的创建和销毁数据库连接,我们需要使用数据库连接池

我们上面提到的 HikariCP 是 Spring Boot DataSource 提供的默认数据库连接池,这一点在启动项目的时候可以观察控制台输出。而在日常开发中,我们通常使用其他的数据库连接池,如 Druid

Druid 是 Alibaba 提供的数据库连接池,也是当前业内公认地最好的连接池,下面我们来使用 Druid 进行配置。

添加 Druid 依赖

<properties>
    <druid.version>1.1.10</druid.version>
</properties>

<!-- druid 连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>${druid.version}</version>
</dependency>

在 application.yml 文件中配置 Druid

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ## 数据库连接
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: demo
      password: demo

      ## 连接池配置
      ## 初始化大小
      initial-size: 5
      ## 最小连接数
      min-idle: 1
      ## 最大连接数
      max-active: 20
      ## 连接等待超时时间 30s
      max-wait: 30000
      ## 检测可以关闭的空闲连接间隔时间 60s
      time-between-eviction-runs-millis: 60000
      ## 连接池中连接的最小生存时间 30s
      min-evictable-idle-time-millis: 30000
      validation-query: SELECT '1'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      ## 打开 PSCache,指定每个连接的 PSCache 大小
      pool-prepared-statements: true
      max-open-prepared-statements: 20
      max-pool-prepared-statement-per-connection-size: 20
      ## 配置状态监控
      filter:
        stat:
          enabled: true
          db-type: mysql
          log-slow-sql: true
          slow-sql-millis: 2000

      ## 配置监控过滤器
      web-stat-filter:
        enabled: true
        ## 添加过滤规则
        url-pattern: /*
        ## 忽略过滤的格式
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

      ## 监控页面配置
      stat-view-servlet:
        enabled: true
        # 访问路径为/druid时,跳转到StatViewServlet
        url-pattern: /druid/*
        # 是否能够重置数据
        reset-enable: false
        # 需要账号密码才能访问控制台
        login-username: admin
        login-password: 123456
        # IP白名单
        # allow: 127.0.0.1
        # IP黑名单(共同存在时,deny优先于allow)
        # deny: 192.168.1.106

      ## 配置 Spring 监控 AOP 切入点
      aop-patterns: com.demo.mybatis.service.*

配置文件中已经指出相关配置说明。

我们在配置文件中配置了 Druid 数据监控,可以通过访问 http://localhost:8080/druid 对数据库连接、Sql 语句执行等多项指标进行监控。具体使用可参考 Druid 官网

4. 使用 Mybatis


Mybatis 提供了两种使用方式:

  • 注解方式
  • 配置文件方式

使用之前我们先创建一张表,并添加几条数据:

CREATE TABLE TB_STUDENT
(
    S_ID   VARCHAR(10) PRIMARY KEY COMMENT '学生id',
    S_NAME VARCHAR(20) NOT NULL COMMENT '学生姓名',
    SEX    VARCHAR(2)  NOT NULL COMMENT '性别'
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8
  COMMENT '学生表';

INSERT INTO TB_STUDENT (S_ID, S_NAME, SEX)
VALUES ('001', 'Jack', 'M ');
INSERT INTO TB_STUDENT (S_ID, S_NAME, SEX)
VALUES ('002', 'Jim', 'M ');
INSERT INTO TB_STUDENT (S_ID, S_NAME, SEX)
VALUES ('003', 'Julia', 'F ');

创建对应实体类:

public class Student implements Serializable {

    private static final long serialVersionUID = 6029454568343571843L;

    private String studentId;

    private String name;

    private String sex;

// 省略 setter、getter、toString
}

4.1 注解方式

创建 Mapper:

@Mapper
public interface StudentMapper {

    /**
     * 新增学生信息
     *
     * @param student 学生信息
     * @return
     */
    @Insert("insert into tb_student (S_ID, S_NAME, SEX) values (#{studentId}, #{name}, #{sex})")
    int add(Student student);

    /**
     * 删除学生信息
     *
     * @param studentId 学生id
     * @return
     */
    @Delete("delete from tb_student where S_ID = #{studentId}")
    int delete(String studentId);

    /**
     * 更新学生信息
     *
     * @param student 学生信息
     * @return
     */
    @Update("update tb_student set S_NAME = #{name}, SEX = #{sex} where S_ID = #{studentId}")
    int update(Student student);

    /**
     * 查询学生信息
     *
     * @param studentId 学生id
     * @return
     */
    @Select("select S_ID, S_NAME, SEX from tb_student where S_ID = #{studentId}")
    @Results(id = "studentMap", value = {
            @Result(property = "studentId", column = "S_ID", javaType = String.class),
            @Result(property = "name", column = "S_NAME", javaType = String.class),
            @Result(property = "sex", column = "SEX", javaType = String.class)
    })
    Student queryById(String studentId);

    /**
     * 查询学生列表
     *
     * @return
     */
    @Select("select * from tb_student")
    @ResultMap("studentMap")
    List<Student> queryList();
}

简单说明一下几个较为常用的注解:

  • @Insert:插入数据,编写对应 SQL 语句,参数使用占位符表示。
  • @Delete:删除数据,用法如上。
  • @Update:更新数据,用法如上。
  • @Select:查询数据,用法如上。需搭配 @Results 或 @ResultMap 使用。
  • @Results:映射对象,由多个 @Result 组成。
  • @Result:映射字段,property 属性指定实体类中的字段名称,column 属性指定表中字段名称,javaType 指定实体类中字段类型,jdbcType 指定表中字段类型。
  • @ResultMap:如果已经配置了 @Results ,指定对应 @Results 的 id 即可。

4.2 配置文件方式

通常我们使用的是配置文件的方式,该方式便于将 sql 语句进行统一管理,可读性也较强。

我们需要在配置文件中指定 mapper.xml 文件扫描路径:

mybatis:
  mapper-locations: classpath:mapper/*.xml

其后我们的 xxxmapper.xml 文件只需要放置 src/resources/mapper/ 目录下就可以被扫描到了。

Mybatis 的其他功能以及 XML 文件的配置说明可参照 Mybatis 中文文档

源码地址:https://github.com/NekoChips/SpringDemo/tree/master/02.springboot-mybatis


关于作者:NekoChips
本文地址:https://www.chenyangjie.com.cn/articles/2020/04/25/1587783556834.html
版权声明:本篇所有文章仅用于学习和技术交流,本作品采用 BY-NC-SA 4.0 许可协议,如需转载请注明出处!
许可协议:知识共享许可协议