前言:
如今兄弟们对“mybatis plus主键策略”大概比较关心,咱们都想要学习一些“mybatis plus主键策略”的相关内容。那么小编也在网上汇集了一些对于“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.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plusspring.datasource.username=rootspring.datasource.password=123456mysql6级以上
注意 driver 和 url 的变化
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8spring.datasource.username=rootspring.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 已经被废弃,否则会出现警告信息。主键生成策略简介
主键生成策略的言下之意就是 数据新增时,数据库中该条数据的主键以什么样的方式生成并存储,常见的主键生成策略如下:
数据库自增长序列或字段UUIDRedis生成IDTwitter的snowflake算法利用zookeeper生成唯一ID
这不是本章重点内容,【但是主键生成策略很重要】,具体的说明您可以参考 主键生成策略 这篇文章,非常不错,有帮助您也记得赞一下!
mybatis-plus主键生成策略
mybatis-plus 3.3.0之后主键生成策略有以下几种,都是中文注释很明确了。大概分为:
数据库自动生成用户自行生成并设置数据通过雪花算法生成ID进行设置
您继续往下看,实现了之后,来设置不同的策略看最终数据,您就能完全掌握这几种策略了
代码实操实体类
在主键属性上添加 @TableId 注解,并使用type属性选中对应的主键策略
@Datapublic class User { @TableId(type = IdType.ASSIGN_ID) private Long id; private String name; private Integer age; private String email;}新增数据
@Testpublic 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 + "条数据");}效果
看到会生成一个19位的ID序号,其他的策略会生成什么呢?还是上述所说,您可以在 实体类 中修改主键生成策略,看结果!
自动填充介绍
自动填充是指:字段会根据我们指定的策略自动生成值,并且在数据新增或者更新时自动填充数据。
比如要实现在新增数据时自动填充数据的创建时间,在修改数据时自动填充数据的更新时间。
实现步骤在数据表中新增 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}实体类改造
@Datapublic 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;@Componentpublic 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修改年龄*/@Testpublic 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方法中写对应逻辑
总结
这次我们先说一下 主键生成策略 和 自动填充,文章内容控制在一个比较舒适的长度上,一定多多练习,加下来更新乐观锁、逻辑删除、代码生成器等。
标签: #mybatis plus主键策略 #mybatisplus 主键 #mybatis plus 主键策略 #mybatis plus主键自增 #java自动生成override