Mybatis插件之Mybatis-Plus的CRUD方法


使用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接口中的所有方法都已經測試完成了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM