千家信息网

MyBatisPlus如何实现自动更新、软删除、乐观锁操作

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,小编给大家分享一下MyBatisPlus如何实现自动更新、软删除、乐观锁操作,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!快速入门步骤创建数据库,数据表使用SpringBoot导入m
千家信息网最后更新 2025年01月24日MyBatisPlus如何实现自动更新、软删除、乐观锁操作

小编给大家分享一下MyBatisPlus如何实现自动更新、软删除、乐观锁操作,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

快速入门

步骤

  1. 创建数据库,数据表

  1. 使用SpringBoot导入maven依赖

                                      mysql            mysql-connector-java            8.0.21                                            org.projectlombok            lombok            1.18.12                                                    com.baomidou            mybatis-plus-boot-starter            3.3.2        


  2. 使用了mybatis-plus 之后(区别于mybatis传统方式entity-dao(连接mybatis,配置mapper.xml文件)-service-controller)

    • 实体类:

      @Datapublic class User  {    /**     * 主键ID     */    @TableId(value = "id", type = IdType.AUTO)    private Long id;    /**     * 姓名     */    private String name;    /**     * 年龄     */    private Integer age;    /**     * 邮箱     */    private String email;}


    • mapper接口

      //对应的的Mapper上面继承基本的类 BaseMapper@Repositorypublic interface UserMapper extends BaseMapper {        //通用CRUD操作父类已经写好}


    • 注意点,我们需要在主启动类上去扫描我们的mapper包下的所有接口

      @MapperScan("com.mybatis.mybatis_plus.mapper")

    • 测试类中可以测试:

          @Autowired    private UserMapper userMapper;    @Test    void contextLoads() {        List userList = userMapper.selectList(null);        userList.forEach(System.out::println);    }


自动更新

所有的数据库表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需 要自动化!

1、在表中新增字段 gmt_create、gmt_modified,类型datetime

2、把实体类同步,实体类字段属性上需要增加注解

    @TableField(fill = FieldFill.INSERT)    private Date gmtCreate;    @TableField(fill = FieldFill.INSERT_UPDATE)    private Date gmtModified;

3、编写handler来处理这个注解!

@Slf4j@Component // 注意加到ioc容器中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);        }}

4、测试插入、测试更新、观察时间即可。

软删除(逻辑删除)

物理删除 :从数据库中直接移除

逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1

1、在数据表中增加一个 deleted 字段

2、实体类中增加属性

    /**     * 是否删除,1已删除,0未删除     */    @TableLogic    private Boolean deleted;

3、配置!

# 配置逻辑删除mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0

新版本Mybatislus无需一下配置了

    @Bean    public ISqlInjector sqlInjector() {        return new LogicSqlInjector();    }

4、测试一下删除! 记录依旧在数据库,但是值确已经变化了,查询也不会显示被删除的数据!

int i = userMapper.deleteById(2L);System.out.println(i);List userList = userMapper.selectList(null);userList.forEach(System.out::println);
乐观锁

乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试

悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

我们这里主要讲解 乐观锁机制!

乐观锁实现方式:

  • 取出记录时,获取当前 version

  • 更新时,带上这个version

  • 执行更新时, set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

    乐观锁:1、先查询,获得版本号 version = 1-- Aupdate user set name = "tom", version = version + 1where id = 2 and version = 1-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!update user set name = "jack", version = version + 1where id = 2 and version = 1


在MyBatisPlus里面使用乐观锁插件

1、给数据添加version字段,整型默认值为1。

2、实体类添加对应字段

    @Version //乐观锁Version注解    private Integer version;

3、注册组件

    // 注册乐观锁插件    @Bean    public OptimisticLockerInterceptor optimisticLockerInterceptor() {        return new OptimisticLockerInterceptor();    }

4、测试

// 测试乐观锁成功!@Testpublic void testOptimisticLocker(){    // 1、查询用户信息    User user = userMapper.selectById(1L);    // 2、修改用户信息    user.setName("Simon");    // 3、执行更新操作    userMapper.updateById(user);}

可以看到更新执行的sql

看完了这篇文章,相信你对"MyBatisPlus如何实现自动更新、软删除、乐观锁操作"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

0