一、前言三连多大胆,就有多大产!开源促使进步,献给每一位技术使用者和爱好者!
干货满满,摆好姿势,准备发车
很久不更,上篇文章简单说了一下MyBatis Plus的简单实用,这次我们主要介绍一下以下几点内容,可以让我们在开发的时候简化代码编写,提高开发速度:
- 新增数据时的 主键生成策略
- 新增和修改数据时 自动填充
- 修改数据时 乐观锁
- 删除数据时的 逻辑删除
2.1、pom文件数据库和项目的创建这块就省略了,可以参考 mybatis-plus入门 文章,不过依赖版本可以修改为mybatis-plus 3.4.3.4版本的,核心配置如下
您可以创建一个springboot或者maven工程都可以,引入以下依赖
2.2、项目配置文件com.baomidou mybatis-plus-boot-starter 3.4.3.4 mysql mysql-connector-java 8.0.27 org.projectlombok lombok 1.18.22
以springboot项目为例,application.properties 配置文件如下,我们这里引入的mysql版本是 8.0.27则使用第二个配置文件
2.2.1、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=1234562.2.2、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=root2.2.1、注意
- 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
这不是本章重点内容,【但是主键生成策略很重要】,具体的说明您可以参考 主键生成策略 这篇文章,非常不错,有帮助您也记得赞一下!
3.2、mybatis-plus主键生成策略mybatis-plus 3.3.0之后主键生成策略有以下几种,都是中文注释很明确了。大概分为:
- 数据库自动生成
- 用户自行生成并设置数据
- 通过雪花算法生成ID进行设置
您继续往下看,实现了之后,来设置不同的策略看最终数据,您就能完全掌握这几种策略了
3.3、代码实操 3.3.1、实体类在主键属性上添加 @TableId 注解,并使用type属性选中对应的主键策略
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
3.3.2、新增数据
@Test
public void addUser() {
// 创建User对象,并设置属性,此处没有设置id
User user = new User();
user.setName("Alice");
user.setEmail("test7.@baomidou.com");
user.setAge(17);
// 调用insert函数将用户添加进数据库
int row = userMapper.insert(user);
System.out.println("成功新增" + row + "条数据");
}
3.3.3、效果
看到会生成一个19位的ID序号,其他的策略会生成什么呢?还是上述所说,您可以在 实体类 中修改主键生成策略,看结果!
自动填充是指:字段会根据我们指定的策略自动生成值,并且在数据新增或者更新时自动填充数据。
比如要实现在新增数据时自动填充数据的创建时间,在修改数据时自动填充数据的更新时间。
4.2、实现步骤-
在数据表中新增 crtate_time 和 update_time 字段,类型为datetime
-
在类中新增createTime 和 updateTime 属性,并在属性上新增 @TableField(… fill = FieldFill.INSERT/UPDATE)注解
-
创建类实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.metaObjectHandler
4.3、自动填充策略【这里我们只是以这create_time 和 update_time 两个属性为例,您如果有需要自动填充的其他属性,也可以通过这种方式实现】
public enum FieldFill {
DEFAULT,
INSERT,
UPDATE,
INSERT_UPDATE
}
4.4、实体类改造
@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;
}
4.5、自动填充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);
}
}
4.5、修改测试
@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方法中写对应逻辑
这次我们先说一下 主键生成策略 和 自动填充,文章内容控制在一个比较舒适的长度上,您可以边看边练。



