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

浙公网安备 33010602011771号