前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis-plus的扩展功能

mybatis-plus的扩展功能

作者头像
暴躁的程序猿
发布2022-03-23 16:53:26
2800
发布2022-03-23 16:53:26
举报

自动填充

在我们的开发中 数据的创建时间 ,修改时间 !这些操作都是自动更新的 不需要我们手动操作

gmt_creat gmt_modify (修改时间) 这两个字段所有的表都要有 而且自动填充

Mybatis-plus中为我们提供了自动填充的扩展功能

一、字段上加入注解

代码语言:javascript
复制
//字段添加填充内容

@TableField(fill = FieldFill.INSERT)
private Date creatTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

二、创建一个填充的处理器

代码语言:javascript
复制
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //插入时的填充策略
        this.setFieldValByName("creatTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //更新时的填充策略
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }
}

测试

代码语言:javascript
复制
  @Test
    //插入
    public void testInsert(){
        User user = new User();
        user.setAge(21);
        user.setName("飞飞");
        user.setEmail("12456789@qq.com");
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

乐观锁

实现方式

取出记录时候获取当前version

更新时 带上version执行更新时 set version=newVersion where version =oldVersion

如果version不对就更新失败

测试乐观锁插件

1.给数据库增加version字段!

在这里插入图片描述
在这里插入图片描述

2.实体类加字段并加入注解

代码语言:javascript
复制
@Version
private Integer version;

3.在mp配置类中注册组件

代码语言:javascript
复制
//开启事务
@EnableTransactionManagement
@Configuration
@MapperScan("com.rpf.dao")
public class MyBatisPlusConfig {
    /**
     *注册乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

测试 我们测试两种情况

第一种情况为单线程情况下的修改

代码语言:javascript
复制
  @Test
    public void TestLock1(){
        //查询id为1的用户信息
        User user = userMapper.selectById(1L);
        //修改用户信息
        user.setAge(23);
        //执行更新操作
        int update = userMapper.updateById(user);

    }

我们看到已经成功了

在这里插入图片描述
在这里插入图片描述

测试多线程场景下的情况 第一个线程查询版本后 设置信息但并未提交 这时第二个线程获取了版本信息 且抢先提交了 等第一个线程提交时就会产生错误 因为有乐观锁

代码语言:javascript
复制
 @Test
    public void TestLock2(){
        //查询id为1的用户信息
        User user = userMapper.selectById(1L);
        //修改用户信息
        user.setAge(23);

        //模拟另一个线程执行插队操作
        User user1 = userMapper.selectById(1L);
        user1.setAge(21);
        int update1 = userMapper.updateById(user1);
        //执行更新操作
        //如果没有乐观锁就会覆盖插队线程的值
        int update = userMapper.updateById(user);
    }

产生了问题 第二个线程提交成功 第一个线程提交失败

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自动填充
  • 乐观锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档