使用Mybatis-plus進行基本的CRUD(增查改刪)操作。
實體類(User)代碼:
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @NoArgsConstructor @AllArgsConstructor @ToString @TableName("tb_user") public class User { @TableId(type = IdType.AUTO) // 需要指定,否則無法新增后拿到回調的id,以及進行刪除等操作 // 查詢的時候不需要查出來的字段,默認true,和@TableId作用在同一個字段上時失效 @TableField(select = false) private Integer uid; private String uname; // 用來解決數據庫中的字段和實體類的字段不匹配問題 @TableField(value = "age",select = false) private Integer uage; // 數據庫中的字段為age // 用來解決實體類中有的屬性但是數據表中沒有的字段 @TableField(exist = false) // 默認為true private String address; // 這是一個數據庫中不存在的字段 public User(String uname, Integer age) { this.uname = uname; this.uage = age; } }
1、增加操作:
代碼如下:直接傳入一個實體即可完成
@Test public void test02(){ // 插入一條記錄 // 1.構建要插入的對象 User user = new User(); user.setUname("zhangsan"); user.setUage(40); // 數據庫中不存在的字段,通過@TableField(exist = false)排除之 user.setAddress("beijing"); // 2.執行添加 返回值為受影響的行數 int result = userMapper.insert(user); System.out.println("受影響的行數=" + result); System.out.println("拿到自增的id=" + user.getUid()); }
2、更新操作:
方法一:int updateById(T entity);
測試代碼:
@Test public void test04(){ // 根據id進行更新 // 1.構建更新的對象 User user = new User(); // 2.根據id來進行更新 user.setUid(1007); // 3.更新的內容值 user.setUname("小莉"); user.setUage(17); // 4.執行更新 int result = userMapper.updateById(user); System.out.println("受影響的行數=" + result); }
方法二:
1-使用QueryWrapper,它只負責條件的匹配
測試代碼:
@Test public void test05(){ // 第一種:使用QueryWrapper,根據條件進行更新 // 1.設置更新的內容值 User user = new User(); user.setUname("王五"); user.setUage(45); // 2.設置更新的匹配條件,可以疊加多個,類似於and QueryWrapper<User> wapper = new QueryWrapper<>(); // 參數1:數據庫中的字段名 參數2:字段名的值(匹配的值) // 解讀:把數據庫中uid字段為1015和1016的值修改成user中的內容 wapper.eq("uid",1015); wapper.or(); // 在查詢中拼接or wapper.eq("uid",1016); // 語句還原:UPDATE tb_user SET uname='王五', age=45 WHERE uid = 1015 OR uid = 1016 // 3.開始更新,參數1:更新的內容 參數2:更新的匹配條件 int result = userMapper.update(user, wapper); System.out.println("受影響的行數=" + result); // 2 }
2-使用UpdateWrapper進行更新操作
測試代碼:
@Test public void test06(){ // 第二種:使用UpdateWrapper,根據條件進行更新 // 1.定義一個UpdateWrapper對象 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); // 2.設置參數 // set(String column, Object val),參數1:數據庫中的字段名 參數2:修改后的值 // eq(String column, Object val),參數1:數據庫中的字段名 參數2:修改條件 // or(),使查詢條件變成用or拼接 wrapper.set("uname","第五人格").set("age",28) .eq("uid",1018).or().eq("uid",1019); // 3.執行修改,使用UpdateWrapper,參數1指定為 null int result = userMapper.update(null, wrapper); System.out.println("受影響的行數=" + result); // 2 // SQL:UPDATE tb_user SET uname=?,age=? WHERE uid = ? OR uid = ? }
注意兩個條件直接如果要用OR拼接,則需要在兩個條件之家插入or()方法。
3、刪除操作:
1-根據id來刪除
@Test public void test03(){ // 1.直接根據id進行刪除 int result = userMapper.deleteById(1014); System.out.println("受影響的行數=" + result); // 1 }
2-根據map條件進行刪除
@Test public void test07(){ // 根據Map來進行刪除,多條件之間是and關系 // 1.構建刪除條件map Map<String,Object> map = new HashMap<>(); // 2.設置刪除條件的值,參數1:數據庫中的字段名,參數2:條件值 map.put("uname","艾瑪x"); map.put("age",80); // 3.執行刪除 int result = userMapper.deleteByMap(map); System.out.println("受影響的行數=" + result); // 1 // SQL:DELETE FROM tb_user WHERE uname = ? AND age = ? }
3-根據查詢條件Wrapper進行刪除:delete(Wrapper<T> wrapper)
使用QueryWrapper進行刪除,測試代碼:
@Test public void test08(){ // 1.構建一個QueryWrapper對象 QueryWrapper<User> wrapper = new QueryWrapper<>(); // 2.為QueryWrapper對象設置條件 wrapper.eq("uid",1010).eq("uname","小柳") // 也可以設置OR條件 .or().eq("uid",1015); // 3.執行刪除 int result = userMapper.delete(wrapper); System.out.println("受影響的行數=" + result); // 2 // SQL:DELETE FROM tb_user WHERE uid = ? AND uname = ? OR uid = ? }
4-根據id集合實現批量刪除:deleteBatchIds(Collection idList)
測試代碼:
@Test public void test09(){ // 根據集合進行刪除(使用的是SQL中的in關鍵字) // 1.構建一個存放id列表的集合 List<Integer> idList = new ArrayList<>(); // 2.存放要進行刪除的id,存放了3個id idList.add(1021); idList.add(1022); idList.add(1023); // 3.執行刪除 int result = userMapper.deleteBatchIds(idList); System.out.println("受影響的行數=" + result); // 3 // SQL:DELETE FROM tb_user WHERE uid IN ( ? , ? , ? ) }
以上就是BaseMapper中增刪改操作的方法。
接下來,介紹其查詢方法,MybatisPlus(MP)提供了多種查詢操作,包括根據id查詢,批量查詢、單挑記錄查詢、查詢列表、分頁查詢等操作。
4、查詢操作
1-根據id查詢單個記錄
測試代碼:
@Test public void test01(){// 根據id進行查詢 // 1.執行查詢操作 User user = userMapper.selectById(1018); // 2.輸出查詢結果 System.out.println(user); }
如果出現以下情況,則需要指定@TableId
2-根據id集合列表查詢多個記錄:selectBatchIds(Collection idList)
測試代碼:
@Test public void test02(){// 根據id集合進行批量查詢 // 1.創建id列表並賦值 List<Integer> ids = new ArrayList<>(); ids.add(1016); ids.add(1017); ids.add(1018); // 2.執行查詢 List<User> users = userMapper.selectBatchIds(ids); // 3.遍歷查詢結果集 for (User user : users) { // 4.打印查詢結果 System.out.println(user); } // SQL:SELECT uid,uname FROM tb_user WHERE uid IN ( ? , ? , ? ) }
3-根據條件進行查詢,用map來封裝查詢條件
測試代碼:
@Test public void test03(){ // 1.構建查詢條件 Map<String, Object> map = new HashMap<>(); map.put("uname","第五人格"); map.put("age",28); // 多個條件之間的SQL用and拼接 // 2.執行查詢 List<User> users = userMapper.selectByMap(map); // 3.打印輸出 printUsers(users); // SQL:SELECT uid,uname FROM tb_user WHERE uname = ? AND age = ? }
4-查詢單挑記錄,若返回加過大於一個,拋出異常MybatisSystemException
測試代碼:
@Test public void test04(){ // 查詢單條記錄 // 1.定義查詢條件對象 QueryWrapper<User> wrapper = new QueryWrapper<>(); // 2.設置查詢條件 wrapper.eq("uname","第五人格"); // 查詢的記錄>1個時,拋出異常MyBatisSystemException User user = userMapper.selectOne(wrapper); // 3.打印結果 System.out.println(user); // SQL:SELECT uid,uname FROM tb_user WHERE uname = ? }
5-查詢符合條件的記錄數,Integer selectCount(Wrapper<User> queryWrapper)
測試代碼:
@Test public void test05(){ // 查詢記錄數,類似於conut(*) // 若需要設置條件可使用Wrapper對象,null表示查詢所有 Integer count = userMapper.selectCount(null); // 打印返回的記錄數 System.out.println("記錄數有 = " + count); // SQL:SELECT COUNT( 1 ) FROM tb_user }
6-查詢符合條件的記錄列表,List<User> selectList(Wrapper<User> queryWrapper)
若參數為null,則為查詢所有
測試代碼:
@Test public void test06(){//根據查詢條件查詢列表 // 1.構建一個QueryWrapper對象 QueryWrapper<User> wrapper = new QueryWrapper<>(); // 2.設置條件,參數1:數據庫字段名,參數2:參數值 wrapper.eq("uname","第五人格"); // 3.執行查詢 List<User> users = userMapper.selectList(wrapper); //List<User> users = userMapper.selectList(null);// 查詢所有 // 4.打印結果 printUsers(users); }
7-根據條件把查詢結果封裝在Map和List中
List<Map<String, Object>> selectMaps(Wrapper<User> queryWrapper)
測試代碼:
@Test public void test07(){ List<Map<String, Object>> maps = userMapper.selectMaps(null); for (Map<String, Object> map : maps) { // 一個map對應一條記錄 // 每個map的key都為字段名 // 每個map的值都為字段具體值 System.out.println(map); } }
8-分頁查詢
首先定義一個新的類為配置類(MybatisPlusConfig)
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { // 分頁插件 @Bean // 注入Spring容器中 public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
之后開始測試,代碼如下:
@Test public void test09(){ // 測試分頁 // 1.查詢條件,null則為查詢所有 Wrapper<User> wrapper = null; // 1.1 使用其構造,參數1:當前頁,參數2:每頁的大小 Page<User> page = new Page<>(1,2); // 2.執行查詢 // 參數1:為接口Ipage,其實現類只有一個Page,參數2:為查詢條件,返回一個Ipage對象 IPage<User> userIPage = userMapper.selectPage(page, wrapper); // 3.打印重要參數 System.out.println("總頁數= " + userIPage.getPages()); System.out.println("總記錄數= " + userIPage.getTotal()); System.out.println("頁面大小= " + userIPage.getSize()); System.out.println("當前頁= " + userIPage.getCurrent()); System.out.println("查詢結果如下:" ); // 4.打印分頁結果 for (User user : userIPage.getRecords()) { System.out.println(user); } // SQL:SELECT uid,uname,age AS uage FROM tb_user LIMIT ?,? }
至此,關於BaseMapper接口中的所有方法都已經測試完成了!