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語句,開啟日誌功能效能就會受到影響,除錯完後記得關閉。