1. 程式人生 > 其它 >HM2022ssm-mp2【MyBatisPlus標準資料層開發】

HM2022ssm-mp2【MyBatisPlus標準資料層開發】

1. 標準CRUD使用

2. 新增

@Test
public void testSave() {
    User user = new User();
    user.setName("黑馬程式設計師");
    user.setPassword("itheima");
    user.setAge(12);
    user.setTel("4006184000");
    int count = userDao.insert(user);
    System.out.println(count);
}

但是資料中的主鍵ID,有點長,那這個主鍵ID是如何來的?

我們更想要的是主鍵自增,應該是5才對,這個是我們後面要學習的主鍵ID生成策略,暫時先放放。

3. 刪除

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

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

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

      從這張圖可以看出,

      • String和Number是Serializable的子類,
      • Number又是Float,Double,Integer等類的父類,
      • 能作為主鍵的資料型別都已經是Serializable的子類,
      • MP使用Serializable作為引數型別,就好比我們可以用Object接收任何資料型別一樣。
  • int:返回值型別,資料刪除成功返回1,未刪除資料返回0。

@Test
public void testDel() {
    int count = userDao.deleteById(1525715226160058369L);
    System.out.println(count);
}

4. 修改

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setName("tom999");
        int count = userDao.updateById(user);
        System.out.println(count);
    }

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

5. 根據ID查詢

T selectById (Serializable id)
@Test
public void testGetById() {
    User user = userDao.selectById(2L);
    System.out.println(user);
}

6. 查詢所有

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

List<T> selectList(Wrapper<T> queryWrapper)
  • Wrapper:用來構建條件查詢的條件,目前我們沒有可直接傳為Null
  • List:因為查詢的是所有,所以返回的資料是一個集合
@Test
public void testGetAll() {
    List<User> userList = userDao.selectList(null);
    for (User user : userList) {
        System.out.println(user);
    }
}

我們所呼叫的方法都是來自於DAO介面繼承的BaseMapper類中。裡面的方法有很多,我們後面會慢慢去學習裡面的內容。

BaseMapper:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> queryWrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

7. Lombok

7.1 概念

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

  • 私有屬性
  • setter...getter...方法
  • toString方法
  • 建構函式

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

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

7.2 使用步驟

7.2.1 步驟1:新增lombok依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <!--<version>1.18.12</version>-->
</dependency>

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

7.2.2 步驟2:安裝Lombok的外掛

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

7.2.3 步驟3:模型類上添加註解

Lombok常見的註解有:

  • @Setter:為模型類的屬性提供setter方法
  • @Getter:為模型類的屬性提供getter方法
  • @ToString:為模型類的屬性提供toString方法
  • @EqualsAndHashCode:為模型類的屬性提供equals和hashcode方法
  • @Data:是個組合註解,包含上面的註解的功能
  • @NoArgsConstructor:提供一個無參建構函式
  • @AllArgsConstructor:提供一個包含所有引數的建構函式

Lombok的註解還有很多,上面標註的三個是比較常用的,其他的大家後期用到了,再去補充學習。

package com.yppah.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data //= @Setter + @Getter + @ToString + @EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
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;
    }
}

這種方式是被允許的。

8. 分頁功能

8.1 介面介紹

基礎的增刪改查就已經學習完了,剛才我們在分析基礎開發的時候,有一個分頁功能還沒有實現,在MP中如何實現分頁功能,就是咱們接下來要學習的內容。

分頁查詢使用的方法是:

IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
  • IPage:用來構建分頁查詢條件
  • Wrapper:用來構建條件查詢的條件,目前我們沒有可直接傳為Null
  • IPage:返回值,你會發現構建分頁條件和方法的返回值都是IPage

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

8.2 使用步驟

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

package com.yppah;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yppah.dao.UserDao;
import com.yppah.domain.User;
import org.junit.Test;
//import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Mp01QuickstartApplication.class)
public class Mp01QuickstartApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    public 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());
    }
    
}

此時直接執行該測試方法,還不能實現分頁功能,效果如下,可以看到仍然是查詢全部

還需要設定攔截器才能實現分頁功能

8.2.2 步驟2:設定分頁攔截器

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

package com.yppah.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {

    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
        //1 建立MybatisPlusInterceptor攔截器物件
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2 新增具體的攔截器,如此處的分頁攔截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3 返回攔截器物件
        return mpInterceptor;
    }

}

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

這些內容在MP的官方文件中有詳細的說明,我們可以檢視官方文件類配置

8.2.3 步驟3:執行測試程式

配置好攔截器後,現在再來執行一下分頁測試方法,可以看到分頁功能生效了

說明:

如果想檢視MP執行的SQL語句,可以修改application.yml配置檔案

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

開啟日誌後,就可以在控制檯打印出對應的SQL語句,開啟日誌功能效能就會受到影響,除錯完後記得關閉。