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

  

posted @ 2022-02-15 22:46  凯宾斯基  阅读(266)  评论(0编辑  收藏  举报