您好,登錄后才能下訂單哦!
小編給大家分享一下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如何實現自動更新、軟刪除、樂觀鎖操作”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。