MyBatisPlus 使用指南 自動更新 軟刪除 樂觀鎖 關聯查詢
快速入門
步驟java
- 建立數據庫,數據表
-
使用SpringBoot導入maven依賴mysql
<!-- 數據庫驅動 --> <!-- 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)sql
-
實體類:數據庫
@Data public class User { /** * 主鍵ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; /** * 郵箱 */ private String email; }
-
mapper接口mybatis
//對應的的Mapper上面繼承基本的類 BaseMapper @Repository public interface UserMapper extends BaseMapper<User> { //通用CRUD操做父類已經寫好 }
-
注意點,咱們須要在主啓動類上去掃描咱們的mapper包下的全部接口app
@MapperScan("com.mybatis.mybatis_plus.mapper")maven
-
測試類中能夠測試:ide
@Autowired private UserMapper userMapper; @Test void contextLoads() { List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); }
-
自動更新
全部的數據庫表:gmt_create、gmt_modified幾乎全部的表都要配置上!並且需 要自動化!測試
一、在表中新增字段 gmt_create、gmt_modified,類型datetimethis
二、把實體類同步,實體類字段屬性上須要增長註解
@TableField(fill = FieldFill.INSERT) private Date gmtCreate; @TableField(fill = FieldFill.INSERT_UPDATE) private Date gmtModified;
三、編寫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); } }
四、測試插入、測試更新、觀察時間便可。
軟刪除(邏輯刪除)
物理刪除 :從數據庫中直接移除
邏輯刪除 :再數據庫中沒有被移除,而是經過一個變量來讓他失效! deleted = 0 => deleted = 1
一、在數據表中增長一個 deleted 字段
二、實體類中增長屬性
/** * 是否刪除,1已刪除,0未刪除 */ @TableLogic private Boolean deleted;
三、配置!
# 配置邏輯刪除 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(); }
四、測試一下刪除! 記錄依舊在數據庫,可是值確已經變化了,查詢也不會顯示被刪除的數據!
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不對,就更新失敗
樂觀鎖:一、先查詢,得到版本號 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裏面使用樂觀鎖插件
一、給數據添加version字段,整型默認值爲1。
二、實體類添加對應字段
@Version //樂觀鎖Version註解 private Integer version;
三、註冊組件
// 註冊樂觀鎖插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }
四、測試
// 測試樂觀鎖成功! @Test public void testOptimisticLocker(){ // 一、查詢用戶信息 User user = userMapper.selectById(1L); // 二、修改用戶信息 user.setName("Simon"); // 三、執行更新操做 userMapper.updateById(user); }
能夠看到更新執行的sql