自动填充
创建时间和修改时间,gmt_create, gmt_modified
方法一:数据库级别(工作中不建议使用,因为无法直接操作数据库)
1、直接在数据库表中新增字段
gmt_create datetime类型 默认值CURRENT_TIMESTAMP
gmt_modified datetime类型 默认值CURRENT_TIMESTAMP 勾选“根据当前时间戳更新”
2、更新实体类与数据库对应
private Date gmtCreate;
private Date gmtModified;
3、更新测试
方式二:代码级别(推荐)
-
删除数据库中的默认值和更新操作
-
给实体类字段属性上加注解
//插入的时候自动填充 @TableField(fill = FieldFill.INSERT) private Date gmtCreate; //插入和更新的时候自动填充 @TableField(fill = FieldFill.INSERT_UPDATE) private Date gmtModified;
-
编写处理器来处理这个注解
-
新建 handle 包创建处理器MyMetaObjectHandler
package swagger.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @Author yetong * @Date 2023-06-25 16:07 * @blog https://blog.csdn.net/Xiao_tongtong **/ //把处理器加到 IOC 容器中 @Component public class MyMetaObjectHandler implements MetaObjectHandler { //插入时的填充策略 @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("gmtCreate",new Date(),metaObject); this.setFieldValByName("gmtModified",new Date(),metaObject); } //更新时的填充策略 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified",new Date(),metaObject); } }
乐观锁
当准备更新一条记录时,希望这条记录这个时候没有被别人更新
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
-
数据库增加 version 字段,默认为 1,int 类型,长度为 10
-
实体类添加 version 属性
@Version private Integer version;
-
注册组件
package swagger.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @Author yetong * @Date 2023-06-25 14:39 * @blog https://blog.csdn.net/Xiao_tongtong **/ @MapperScan("swagger.mapper") @Configuration //自动管理事务 @EnableTransactionManagement public class MybatisPlusConfig { //注册乐观锁插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
-
测试
//测试没有通过乐观锁 @Test public void TestUpdate(){ //模拟线程 1 执行一个更新操作 Users users = usersMapper.selectById(1L); users.setName("yetong111"); users.setEmail("123@qq.com"); usersMapper.updateById(users); //此时还没有提交更新,然后线程 2 介入,直接提交更新 Users user = usersMapper.selectById(1L); user.setName("yetong2222"); user.setEmail("123@qq.com"); usersMapper.updateById(user); //没有乐观锁的话,现在数据已经变成yetong222,线程 1提交后会覆盖成yetong111 usersMapper.updateById(users); } //通过乐观锁 @Test public void testOptimisticLocker(){ Users users = usersMapper.selectById(1L); users.setName("yetong"); users.setEmail("123@qq.com"); usersMapper.updateById(users); }