Mybatis-Plus一些簡單使用技巧
阿新 • • 發佈:2022-05-29
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
Insert插入
主鍵生成策略
預設生成,通過雪花演算法生成ID 參考部落格:https://blog.csdn.net/lq18050010830/article/details/89845790
==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? ) ==> Parameters: 1423577873627734017(Long), 哈撒給(String), 19(Integer), [email protected](String)
可以觀察到@TableId注下有很多主鍵生成方案
AUTO(0),自增長ID,前提是將資料庫設定為自增長
INPUT(2),自己輸入ID
ASSIGN_ID(3),雪花演算法,預設
ASSIGN_UUID(4),不帶下劃線的UUID,但是是String型別的
自動填充
gmt_create (建立時間)gmt_modified(修改時間)這兩個屬性都需要操作自動化完成,我們並不能手動的去控制。
先在資料庫里加上這兩個欄位
然後更改實體類,在要操作的欄位上加@TableField註解,注意這裡是時間的型別是LocalDateTime
@TableField(fill = FieldFill.INSERT) private LocalDateTime gmtCreate; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime gmtModified;
這個註解下有一個FieldFill類下有這麼幾個常量
DEFAULT,
INSERT,
UPDATE,
INSERT_UPDATE;
然後寫一個類實現MetaObjectHandler介面
這個類必須@Component註冊為元件
- public void insertFill(MetaObject metaObject)是執行插入時候執行的方法
- public void updateFill(MetaObject metaObject)是修改時執行的方法
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Overridepublic void insertFill(MetaObject metaObject) { this.setFieldValByName("gmtCreate", LocalDateTime.now(), metaObject); this.setFieldValByName("gmtModified",LocalDateTime.now(),metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified",LocalDateTime.now(),metaObject); } }
樂觀鎖OptimisticLockerInnerInterceptor
當要更新一條記錄的時候,希望這條記錄沒有被別人更新
樂觀鎖實現方式:
- 取出記錄時,獲取當前version
- 更新時,帶上這個version(作為oldVersion)
- 執行更新時, set version = newVersion where version = oldVersion
- 如果version不對,就更新失敗
在資料庫新增一個version列,預設值為1
在實體類中同樣增加version,並且加上@version註解
- 寫一個MP的配置類,再次配置樂觀鎖的元件
@Configuration @MapperScan("com.lyk.mapper") public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; } }
分頁查詢
寫一個MP的配置類
@Configuration @MapperScan("com.lyk.mapper") public class MyBatisPlusConfig { //分頁查詢 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor2() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); return interceptor; } }
然後測試
- 先獲取Page物件
Page(long current, long size)
- current是當前頁數
- size是當前頁數大小
Page<User> userPage = userMapper.selectPage(page, null); List<User> records = page.getRecords();
page.getRecords()獲取分頁資料。
@Test void limitText(){ Page<User> page = new Page<>(1,5); Page<User> userPage = userMapper.selectPage(page, null); List<User> records = page.getRecords(); System.out.println("是否有前一頁"+page.hasPrevious()); System.out.println("是否有後一頁"+page.hasNext()); System.out.println("一頁有"+page.getSize()+"條資料"); System.out.println("總頁數: "+page.getPages()); System.out.println("總記錄數: "+page.getTotal()); for (User record : records) { System.out.println(record); }
邏輯刪除
給資料庫新增一個del欄位作為刪除標記
- 0代表未刪除,是預設值
- 1代表已刪除
給實體類增加這個欄位,並標註@TableLogic註解
@TableLogic private int del;
在配置檔案中配置
mybatis-plus.global-config.db-config.logic-delete-field=del mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
邏輯刪除特點
- 並不是在資料庫層面刪除了資料,只是修改了刪除標記。
- 在我們之後做查詢操作的時候會追加一個條件
del=0
。 - 也就是說邏輯刪除的資料我們仍然是查詢不到的,只有資料庫管理員在後臺可以檢視。