1. 程式人生 > 其它 >Mybatis-Plus一些簡單使用技巧

Mybatis-Plus一些簡單使用技巧

<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 {

    @Override
    
public 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
  • 也就是說邏輯刪除的資料我們仍然是查詢不到的,只有資料庫管理員在後臺可以檢視。