MyBatis-plus中乐观锁实现 记录 (含@TableField策略)--create_time 对应的java类型
参考文章:
https://blog.csdn.net/qq_43612538/article/details/105824506
https://www.jianshu.com/p/cca30f74d91a
https://blog.csdn.net/YyjYsj/article/details/112360448(实体类 加 @TableField策略的方法)
@TableField具体见 https://blog.csdn.net/qq_40241957/article/details/101772536
目录分布
NewTable 实体类
这里主要是
@TableField
@Version
2个注解
package com.dao.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; @Data public class NewTable { @TableId(type = IdType.AUTO) private Integer id; private String name; private String gender; private Integer age; @TableField(fill = FieldFill.INSERT) //INSERT的含义就是添加,也就是说在做添加操作时,下面一行中的createTime会有值 private long create_time_l; @Version //用于实现乐观锁-----要实现乐观锁加这个就可以了 @TableField(fill = FieldFill.INSERT_UPDATE) //INSERT_UPDATE的含义就是在做添加和修改时下面一行中的updateTime都会有值 private long update_time_l; private LocalDateTime create_time; private LocalDateTime update_time; }
其他 设置元素的方法
// @TableId(type = IdType.AUTO)//主键自动增长
@TableId(type = IdType.ID_WORKER)//mp自带策略,生成19位的ID值,数字类型使用这种策略,比如long
// @TableId(type = IdType.ID_WORKER_STR)//mp自带策略,生成19位的ID值,字符串类型使用这种策略,比如string
// @TableId(type = IdType.INPUT)//ID值不会帮我们生成,需要自己手动输入ID
// @TableId(type = IdType.NONE)//不用任何策略,也是需要自己手动输入ID
// @TableId(type = IdType.UUID)//每次帮我们生成一个随机的唯一的ID值
private Integer id;
MyMetaObjectHandler ----这个通用方法是给你 @TableField 注解用的,实现乐观锁不需要也行
package com.Common; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理 public class MyMetaObjectHandler implements MetaObjectHandler { //使用mp实现添加的操作,这个方法就会执行 @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTimeL",new Date().getTime(),metaObject); this.setFieldValByName("updateTimeL",new Date().getTime(),metaObject); //设置版本号version的初始值为1 //不加这个也可以,version的默认值为null,加了就是设置version的值从1开始 // this.setFieldValByName("version",1,metaObject); } //使用mp实现修改的操作,这个方法就会执行 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTimeL",new Date().getTime(),metaObject); } }
MyBatisPlusConfig------//配置文件里加 注册乐观锁插件
package com.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @MapperScan("com.mapper") public class MyBatisPlusConfig { // sql执行效率插件 @Bean @Profile({"dev","test"}) //设置dev、test环境开启 public PerformanceInterceptor PerformanceInterceptor(){ PerformanceInterceptor PerformanceInterceptor = new PerformanceInterceptor(); PerformanceInterceptor.setMaxTime(95000);//设置sql执行的最大时间,如果超过了则不执行,抛异常 PerformanceInterceptor.setFormat(true); //开启sql格式化 return PerformanceInterceptor; } //注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } }
test_Dao
package com.dao.mapper.test; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dao.entity.NewTable; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Update; @DS("localhostsource") public interface test_Dao extends BaseMapper<NewTable> { }
TestServer
package com.server.TestService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dao.entity.NewTable; import com.dao.mapper.test.test_Dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class TestServer { @Autowired private test_Dao test_Dao; public void bbb(){ // 插入 // NewTable NewTable=new NewTable(); // NewTable.setName("张三"); // NewTable.setAge(1); // NewTable.setGender("小班"); // test_Dao.insert(NewTable); // 更新-----先要去查询一次 NewTable NewTable = test_Dao.selectById(2); //再执行更新 NewTable.setAge(60); test_Dao.updateById(NewTable); } }
实际sql ------他把带有乐观锁@Version的字段会获取第一次查询时的结果,拼接到下一次插入的where条件厘面,其他人是弄了个version字段的 那么就要配合@TableField策略
Execute SQL: UPDATE new_table SET name='占2', gender='小班', age=60, create_time_l=0, update_time_l=1 WHERE id=2 AND update_time_l=0