005.SpringBoot集成MybatisPlus

252 阅读6分钟

本节目标

  • SpringBoot如何集成MybatisPlus
  • 实现对sys_user表的增删改查操作

MybatisPlus介绍

MybatisPlus简称MP。是一个Mybatis的增强工具,它可以使数据库的单表操作变得异常丝滑。虽然市面上有很多的类似工具,但是凭借其在github和gitee的star数,可以充分体现其霸主地位了。这也正是我们选择它的原因,它比mybatis更好用,维护的也很频繁,社区也非常活跃。有问题基本网上都能得到相应的解决方案。

关于它的详细介绍可以参考如下系列文档(友情提示:记得用Firefox浏览器查看):

传送门

注意:

传送门中的内容建议先看,因为下面的例子,是基于传送门中配置的MybatisX生成模版后,而生成的代码。

准备数据库和测试表

1.数据库

这里采用mysql数据库5.7作为测试库。

2.创建库

请注意这里用utf8mb4字符集而没有用utf8。因为utf8最大字符长度为3字节;而utf8mb4是4字节。一些比较生僻的汉字和emoji表情是无法用utf8存储的。

3.创建表

CREATE TABLE `sys_user` (
  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
  `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
  `user_name` varchar(30) NOT NULL COMMENT '用户账号',
  `nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
  `email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
  `phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码',
  `sex` int(2) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
  `avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
  `password` varchar(100) DEFAULT '' COMMENT '密码',
  `status` int(2) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
  `del_flag` int(2) DEFAULT '0' COMMENT '删除标志(0为删除 1代表删除)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';

集成Mybatis Plus

springboot集成一个第三方框架或者工具。一般最多也就是“三板斧”:

  • 第一板斧:加依赖(pom文件中加入maven依赖,不能省略)
  • 第二板斧:加注解(一般是springboot的启动类上加,一般不用加)
  • 第三板斧:写配置(一般在application.yml加入相关配置,也有很大概率不用加)

1. 加入依赖

    <dependencyManagement>
        <dependencies>
            <!--==================================== -->
            <!-- springboot 依赖 -->
            <!--==================================== -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
​
    <dependencies>
        <!-- springboot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
​
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
​
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
​
        <!-- Mybatis Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
    </dependencies>

2. 加注解(这里不用加注解)

Mybatis的Mpper类可以通过在application类上加注解进行扫描,比如:

@MapperScan("com.mayuanfei.sprignboot04.domain.mapper")
@SpringBootApplication
public class Springboot04Application {
    public static void main(String[] args) {
        SpringApplication.run(Springboot04Application.class, args);
    }
}

但是还有一种方式,就是在每个Mapper类上加@Mapper注解,由于我们后面使用MybatisX插件自动生成Mapper类,在生成的时候就会加入@Mapper注解,所以这里我们是不需要加入@MapperScan("xxx")注解的。

3. 写配置

MP的配置介绍:传送门

这里MP仅仅做一个简单的配置:

spring:
  profiles:
    active: dev
  datasource:
    hikari:
      # 最小空闲连接数量
      minimum-idle: 2
      # 空闲连接最大存活时间(毫秒)。默认是600000,10分钟。这里设置3分钟
      idle-timeout: 180000
      # 最大连接数,默认是10
      maximum-pool-size: 20
      # 连接池返回的连接,是否自动提交。默认是true
      auto-commit: true
      # 连接池的名称.出现在日志记录和JMX管理控制台中,用以识别连接池和配置
      pool-name: jspeed-webapi-hikari
      # 连接池中的连接最长生命周期。0:表示无限生命;默认1800000毫秒,30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30000,也就是30秒超时
      connection-timeout: 30000
      # 如果驱动支持JDBC4,强烈建议不要设置此属性
      connection-test-query: select 1 from dual
  mvc:
    throw-exception-if-no-handler-found: true
  aop:
    proxy-target-class: true
  jackson:
    default-property-inclusion: non_null

# Mybatis Plus配置
mybatis-plus:
  configuration:
    # 日志输出。这里设置不进行日志输入。默认是:org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
  global-config:
    # 设置不输出banner
    banner: false

application-dev.yml

server:
  port: 8084

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.0.176:3306/springboot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

MybatisX生成代码

1. 安装插件MybatisX(略)

image-20230517145322108

2. Idea中Database中增加我们的springboot-demo库

image-20230517145703193

image-20230517152038784

3. 用MybatisX生产代码

image-20230517152607443

image-20230517152803533

image-20230517160609949

image-20230517154355573

最终生成了两个类:

image-20230517160810827

说明:

开发中,有很多项目都会有Mybatis的xml配置文件,里面都是sql,而我这里主张不要这些类,都写在Mapper接口类中,通过注解形式@Select @Update这种方式来写复杂sql。

进行增删改查测试

1. 增加测试

@Test
public void testInsert() {
    SysUser sysUser = new SysUser();
    sysUser.setUserName("老马");
    sysUser.setNickName("老马哥");
    this.sysUserMapper.insert(sysUser);
    System.out.println(sysUser);
}

数据库记录可以看到插入成功了:

image-20230518142658687

这里的user_id是MP默认的雪花算法生成的。因为我们的SysUser类UserId定义如下:

@TableName(value ="sys_user")
@Data
public class SysUser extends BaseEntity implements Serializable {
    /**
     * 用户ID
     */
    @TableId
    private Long userId;
    ......
}

这里的userId没有设置主键类型,而默认的主键类型为:

/**
 * 主键类型
 * {@link IdType}
 */
IdType type() default IdType.NONE;

image-20230524093817323

而NONE的官方解释为:无状态,该类型为未设置主键类型,注解里等于跟随全局。而全局的设置什么呢?

image-20230524093338577

从这里可以看出,默认的id生成是雪花算法。

2. 增加测试-采用数据库自增

上面的插入采用的是雪花算法的id值,这里如果要使用数据库自增的id。需要需改两个地方:

  • 数据库设置sys_user表的user_id为自增字段。

    image-20230524102919719

  • 实体类的user_id需要修改idType为AUTO

    @TableName(value ="sys_user")
    @Data
    public class SysUser extends BaseEntity implements Serializable {
        /**
         * 用户ID
         */
        @TableId(type = IdType.AUTO)
        private Long userId;
        ......
    
  • 再次进行增加测试

    image-20230524103808314

3. 删除测试

@Test
public void testDelete() {
    int result = this.sysUserMapper.deleteById(1);
    Console.log("result={}", result);
}

打印输出:

image-20230524104846833

4.删除测试-逻辑删除

在有些场景下,我们并不希望真正删除一条记录,而是把状态修改下,不去显示而已。这种就是逻辑删除。

这里我们仅仅在实体类中对删除字段上加上注解@TableLogic即可,如下代码:

@TableName(value ="sys_user")
@Data
public class SysUser extends BaseEntity implements Serializable {
    /**
     * 用户ID
     */
    @TableId(type = IdType.AUTO)
    private Long userId;
    // ...省略...
    /**
     * 删除标志(0未删除 1代表删除)
     */
    @TableLogic
    private Integer delFlag;

执行删除结果:

image-20230524105840263

5. 修改测试

@Test
public void testUpdate() {
    SysUser sysUser = new SysUser();
    sysUser.setUserId(4L);
    sysUser.setUserName("老马3333");
    sysUser.setNickName("老马3333");
    this.sysUserMapper.updateById(sysUser);
}

执行修改结果:

image-20230524111630665

6. 查询测试

@Test
public  void testSelect() {
    List<SysUser> users = new LambdaQueryChainWrapper<>(this.sysUserMapper)
            .eq(SysUser::getUserId, 4L)
            .like(SysUser::getUserName, "马")
            .list();
    Console.log("users -> {}", users);
}

执行结果打印:

users -> [SysUser(userId=4, deptId=null, userName=老马3333, nickName=老马3333, email=, phonenumber=, sex=0, avatar=, password=, status=0, delFlag=0)]

代码地址

gitee.com/mayuanfei/S…下的springboot04

记忆印记

  • springboot集成三板斧
  • MybatisX生成代码
  • MP大概的增删改查怎么用,这里重点在IdType的指定和逻辑删除的注解