Java開發學習(四十一)----MyBatisPlus標準資料層(增刪查改分頁)開發

2022-11-14 06:00:29

一、標準CRUD使用

對於標準的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢?

我們先來看張圖:

1.1 環境準備

這裡用的環境就是Java開發學習(四十)----MyBatisPlus入門案例與簡介中使用的環境

二、新增

在進行新增之前,我們可以分析下新增的方法:

int insert (T t)
  • T:泛型,新增用來儲存新增資料

  • int:返回值,新增成功後返回1,沒有新增成功返回的是0

在測試類中進行新增操作:

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
​
    @Test
    void testSave() {
        User user = new User();
        user.setName("黑馬程式設計師");
        user.setPassword("itheima");
        user.setAge(12);
        user.setTel("4006184000");
        userDao.insert(user);
    }
}

執行測試後,資料庫表中就會新增一條資料。

但是資料中的主鍵ID,有點長,那這個主鍵ID是如何來的?我們更想要的是主鍵自增,應該是5才對,這個是我們後面要介紹的主鍵ID生成策略,這塊的這個問題,我們暫時先放放。

三、刪除

在進行刪除之前,我們可以分析下刪除的方法:

int deleteById (Serializable id)
  • Serializable:引數型別

    • 思考:引數型別為什麼是一個序列化類?

      從這張圖可以看出,

      • String和Number是Serializable的子類,

      • Number又是Float,Double,Integer等類的父類別,

      • 能作為主鍵的資料型別都已經是Serializable的子類,

      • MyBatisPlus使用Serializable作為引數型別,就好比我們可以用Object接收任何資料型別一樣。

  • int:返回值型別,資料刪除成功返回1,未刪除資料返回0。

在測試類中進行新增操作:

 @SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
​
    @Test
    void testDelete() {
        // 傳入主鍵id
        userDao.deleteById(1401856123725713409L);
    }
}
​

四、修改

在進行修改之前,我們可以分析下修改的方法:

int updateById(T t);
  • T:泛型,需要修改的資料內容,注意因為是根據ID進行修改,所以傳入的物件中需要有ID屬性值

  • int:返回值,修改成功後返回1,未修改資料返回0

在測試類中進行新增操作:

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
​
    @Test
    void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setName("Tom888");
        user.setPassword("tom888");
        userDao.updateById(user);
    }
}

說明:修改的時候,只修改實體物件中有值的欄位。

五、根據ID查詢

在進行根據ID查詢之前,我們可以分析下根據ID查詢的方法:

T selectById (Serializable id)
  • Serializable:引數型別,主鍵ID的值

  • T:根據ID查詢只會返回一條資料

在測試類中進行新增操作:

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
    
    @Test
    void testGetById() {
        User user = userDao.selectById(2L);
        System.out.println(user);
    }
}

六、查詢所有

在進行查詢所有之前,我們可以分析下查詢所有的方法:

List<T> selectList(Wrapper<T> queryWrapper)
  • Wrapper:用來構建條件查詢的條件,目前我們沒有可直接傳為Null

  • List<T>:因為查詢的是所有,所以返回的資料是一個集合

在測試類中進行新增操作:

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
    
    @Test
    void testGetAll() {
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }
}

七、Lombok

程式碼寫到這,我們會發現DAO介面類的編寫現在變成最簡單的了,裡面什麼都不用寫。反過來看看模型類的編寫都需要哪些內容:

  • 私有屬性

  • setter...getter...方法

  • toString方法

  • 建構函式

雖然這些內容不難,同時也都是通過IDEA工具生成的,但是過程還是必須得走一遍,那麼對於模型類的編寫有沒有什麼優化方法?就是我們接下來的Lombok。

概念

  • Lombok,一個Java類庫,提供了一組註解,簡化POJO實體類開發。

使用步驟

步驟1:新增lombok依賴
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <!--<version>1.18.12</version>-->
</dependency>

注意:版本可以不用寫,因為SpringBoot中已經管理了lombok的版本。

步驟2:安裝Lombok的外掛

新版本IDEA已經內建了該外掛,如果刪除setter和getter方法程式有報紅,則需要安裝外掛

如果在IDEA中找不到lombok外掛,可以存取如下網站

https://plugins.jetbrains.com/plugin/6317-lombok/versions

根據自己IDEA的版本下載對應的lombok外掛,下載成功後,在IDEA中採用離線安裝的方式進行安裝。

步驟3:模型類上新增註解

Lombok常見的註解有:

  • @Setter:為模型類的屬性提供setter方法

  • @Getter:為模型類的屬性提供getter方法

  • @ToString:為模型類的屬性提供toString方法

  • @EqualsAndHashCode:為模型類的屬性提供equals和hashcode方法

  • @Data:是個組合註解,包含上面的註解的功能

  • @NoArgsConstructor:提供一個無參建構函式

  • @AllArgsConstructor:提供一個包含所有引數的建構函式

Lombok的註解還有很多,上面標紅的三個是比較常用的。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}

說明:

Lombok只是簡化模型類的編寫,我們之前的方法也能用,比如有人會問:我如果只想要有name和password的建構函式,該如何編寫?

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
​
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

這種方式是被允許的。

八、分頁功能

分頁查詢使用的方法是:

IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
  • IPage:用來構建分頁查詢條件

  • Wrapper:用來構建條件查詢的條件,目前我們沒有可直接傳為Null

  • IPage:返回值,你會發現構建分頁條件和方法的返回值都是IPage

IPage是一個介面,我們需要找到它的實現類來構建它,具體的實現類,可以進入到IPage類中按ctrl+h,會找到其有一個實現類為Page

步驟1:呼叫方法傳入引數獲取返回值

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
​
    @Autowired
    private UserDao userDao;
    
    //分頁查詢
    @Test
    void testSelectPage(){
        //1 建立IPage分頁物件,設定分頁引數,1為當前頁碼,3為每頁顯示的記錄數
        IPage<User> page=new Page<>(1,3);
        //2 執行分頁查詢
        userDao.selectPage(page,null);
        //3 獲取分頁結果
        System.out.println("當前頁碼值:"+page.getCurrent());
        System.out.println("每頁顯示數:"+page.getSize());
        System.out.println("一共多少頁:"+page.getPages());
        System.out.println("一共多少條資料:"+page.getTotal());
        System.out.println("資料:"+page.getRecords());
    }
}

步驟2:設定分頁攔截器

這個攔截器MyBatisPlus已經為我們提供好了,我們只需要將其設定成Spring管理的bean物件即可。

@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1 建立MybatisPlusInterceptor攔截器物件
        MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
        //2 新增分頁攔截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

說明:上面的程式碼記不住咋辦呢?

這些內容在的官方檔案中有詳細的說明,我們可以檢視官方檔案類設定

步驟3:執行測試程式

如果想檢視MybatisPlus執行的SQL語句,可以修改application.yml組態檔,

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #列印SQL紀錄檔到控制檯

開啟紀錄檔後,就可以在控制檯列印出對應的SQL語句,開啟紀錄檔功能效能就會受到影響,偵錯完後記得關閉。