小编给大家分享一下MyBatisPlus如何实现自动更新、软删除、乐观锁操作,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
步骤
创建数据库,数据表
使用SpringBoot导入maven依赖
<!-- 数据库驱动 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- lombok -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- mybatis-plus -->
<!-- mybatis-plus 是自己开发,并非官方的! -->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
使用了mybatis-plus 之后(区别于mybatis传统方式entity-dao(连接mybatis,配置mapper.xml文件)-service-controller)
实体类:
@Data
public class User {
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 邮箱
*/
private String email;
}
mapper接口
//对应的的Mapper上面继承基本的类 BaseMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
//通用CRUD操作父类已经写好
}
注意点,我们需要在主启动类上去扫描我们的mapper包下的所有接口
@MapperScan("com.mybatis.mybatis_plus.mapper")
测试类中可以测试:
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> 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=1
mybatis-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<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试
悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
我们这里主要讲解 乐观锁机制!
乐观锁实现方式:
取出记录时,获取当前 version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1
-- A
update user set name = "tom", version = version + 1
where id = 2 and version = 1
-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
update user set name = "jack", version = version + 1
where id = 2 and version = 1
在MyBatisPlus里面使用乐观锁插件
1、给数据添加version字段,整型默认值为1。
2、实体类添加对应字段
@Version //乐观锁Version注解
private Integer version;
3、注册组件
// 注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
4、测试
// 测试乐观锁成功!
@Test
public void testOptimisticLocker(){
// 1、查询用户信息
User user = userMapper.selectById(1L);
// 2、修改用户信息
user.setName("Simon");
// 3、执行更新操作
userMapper.updateById(user);
}
可以看到更新执行的sql
看完了这篇文章,相信你对“MyBatisPlus如何实现自动更新、软删除、乐观锁操作”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4087795/blog/4563433