天天看点

解锁MyBatis-Plus主键生成策略和数据自动填充

作者:添甄

首次接触MyBatis-Plus是在2018年年年底,因MyBatis-Plus的强大功能,目前不少公司都会引入,也深深吸引了我,我公司技术选型时我也会引入了MyBatis-Plus,在使用【若依】等框架时也会将其中的mybatis替换为mybatis-plus进行重构,遂通过MyBatis专栏将MyBatis和MyBatis-Plus的相关技术点安利给读者朋友,喜欢的点个赞吧,非常实用!

前言

上篇文章简单说了一下MyBatis Plus的简单实用,这次我们主要介绍一下以下几点内容,可以让我们在开发的时候简化代码编写,提高开发速度:

  • 新增数据时的 主键生成策略
  • 新增和修改数据时 自动填充
  • 修改数据时 乐观锁
  • 删除数据时的 逻辑删除

准备工作

数据库和项目的创建这块就省略了,可以参考 mybatis-plus入门 文章,不过依赖版本可以修改为mybatis-plus 3.4.3.4版本的,核心配置如下

pom文件

您可以创建一个springboot或者maven工程都可以,引入以下依赖

<dependencies>
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
  </dependency>

  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
  </dependency>
</dependencies>           

项目配置文件

以springboot项目为例,application.properties 配置文件如下,我们这里引入的mysql版本是 8.0.27则使用第二个配置文件

mysql6以下

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus
spring.datasource.username=root
spring.datasource.password=123456           

mysql6级以上

注意 driver 和 url 的变化

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root           

注意

  • MySQL8的驱动的url使用 serverTimezone=GMT%2B8 作为后缀,因为springboot2.1之后集成的MySQL版本是8.0的驱动,这个版本的JDBC驱动需要加上此后缀,否则会出现 java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or representsmore 这个报错
  • driver-class使用的是 com.mysql.cj.jdbc.Driver 这个驱动类,之前的 com.mysql.jdbc.Driver 已经被废弃,否则会出现警告信息。

主键生成策略

简介

主键生成策略的言下之意就是 数据新增时,数据库中该条数据的主键以什么样的方式生成并存储,常见的主键生成策略如下:

  • 数据库自增长序列或字段
  • UUID
  • Redis生成ID
  • Twitter的snowflake算法
  • 利用zookeeper生成唯一ID

这不是本章重点内容,【但是主键生成策略很重要】,具体的说明您可以参考 主键生成策略 这篇文章,非常不错,有帮助您也记得赞一下!

mybatis-plus主键生成策略

mybatis-plus 3.3.0之后主键生成策略有以下几种,都是中文注释很明确了。大概分为:

  • 数据库自动生成
  • 用户自行生成并设置数据
  • 通过雪花算法生成ID进行设置

您继续往下看,实现了之后,来设置不同的策略看最终数据,您就能完全掌握这几种策略了

解锁MyBatis-Plus主键生成策略和数据自动填充

代码实操

实体类

在主键属性上添加 @TableId 注解,并使用type属性选中对应的主键策略

@Data
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}           

新增数据

@Test
public void addUser() {
    // 创建User对象,并设置属性,此处没有设置id
    User user = new User();
    user.setName("Alice");
    user.setEmail("[email protected]");
    user.setAge(17);
    // 调用insert函数将用户添加进数据库
    int row = userMapper.insert(user);
    System.out.println("成功新增" + row + "条数据");
}           

效果

看到会生成一个19位的ID序号,其他的策略会生成什么呢?还是上述所说,您可以在 实体类 中修改主键生成策略,看结果!

解锁MyBatis-Plus主键生成策略和数据自动填充

自动填充

介绍

自动填充是指:字段会根据我们指定的策略自动生成值,并且在数据新增或者更新时自动填充数据。

比如要实现在新增数据时自动填充数据的创建时间,在修改数据时自动填充数据的更新时间。

实现步骤

  • 在数据表中新增 crtate_time 和 update_time 字段,类型为datetime
  • 在类中新增createTime 和 updateTime 属性,并在属性上新增 @TableField(.. fill = FieldFill.INSERT/UPDATE)注解
  • 创建类实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

【这里我们只是以这create_time 和 update_time 两个属性为例,您如果有需要自动填充的其他属性,也可以通过这种方式实现】

自动填充策略

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入填充字段
     */
    INSERT,
    /**
     * 更新填充字段
     */
    UPDATE,
    /**
     * 插入和更新填充字段
     */
    INSERT_UPDATE
}           

实体类改造

@Data
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    
    // 设置新增时自动填充
    
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    // 设置新增和修改时自动填充

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}           

自动填充handler类

该类为新建类,实现 MetaObjectHandler 接口,重写 insertFill(新增时运行) 和 updateFill(修改时运行) 两个方法

package com.buye.mp.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 使用MP实现添加操作,该方法执行,新增数据时填充创建和修改时间
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    // 使用MP实现修改操作,该方法执行,修改时生成更新时间
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}           

修改测试

/**
根据id修改年龄
*/
@Test
public void updateUser() {
    User user = new User();

    user.setId(1456789755448);
    user.setAge(90);
    int row = userMapper.updateById(user);

    System.out.println("修改" + row + "条数据");

}           

1、新增测试函数上边已经写过了,您可以自行对添加进行测试,然后看自动填充的结果

2、自动填充我们这里只是对两个时间进行测试,您如果有其他需求,比如:添加时需要自动填充 创建者,状态等数据,您依然可以通过该方式在 insertFill 和 updateFill方法中写对应逻辑

总结

这次我们先说一下 主键生成策略 和 自动填充,文章内容控制在一个比较舒适的长度上,一定多多练习,加下来更新乐观锁、逻辑删除、代码生成器等。