MyBatis-Plus?Mapper?接口方法操作詳解
MyBatis-Plus Mapper 接口方法詳解
1. BaseMapper 核心方法概覽
MyBatis-Plus 的 BaseMapper<T> 接口提供了豐富的 CRUD 操作方法,所有方法都不需要編寫 SQL即可使用。
1.1 完整方法列表
| 方法類別 | 方法名 | 說明 | 使用場景 |
|---|---|---|---|
| 插入 | insert(T entity) | 插入一條記錄 | 新增數(shù)據(jù) |
| 刪除 | deleteById(Serializable id) | 根據(jù)ID刪除 | 按主鍵刪除 |
deleteBatchIds(Collection ids) | 批量ID刪除 | 批量刪除 | |
deleteByMap(Map map) | 根據(jù)Map刪除 | 簡單條件刪除 | |
delete(Wrapper wrapper) | 條件刪除 | 復(fù)雜條件刪除 | |
| 更新 | updateById(T entity) | 根據(jù)ID更新 | 按主鍵更新 |
update(T entity, Wrapper wrapper) | 條件更新 | 復(fù)雜更新邏輯 | |
| 查詢 | selectById(Serializable id) | 根據(jù)ID查詢 | 按主鍵查詢 |
selectBatchIds(Collection ids) | 批量ID查詢 | 按主鍵列表查詢 | |
selectByMap(Map map) | 根據(jù)Map查詢 | 簡單條件查詢 | |
selectOne(Wrapper wrapper) | 查詢單條記錄 | 確保結(jié)果唯一時(shí) | |
selectCount(Wrapper wrapper) | 查詢記錄數(shù) | 統(tǒng)計(jì)數(shù)量 | |
selectList(Wrapper wrapper) | 查詢列表 | 條件查詢 | |
selectMaps(Wrapper wrapper) | 查詢Map列表 | 只需要部分字段 | |
| 分頁 | selectPage(Page page, Wrapper wrapper) | 分頁查詢 | 分頁數(shù)據(jù)查詢 |
selectMapsPage(Page page, Wrapper wrapper) | Map分頁查詢 | 分頁+部分字段 |
public interface BaseMapper<T> extends Mapper<T> {
// ========== 插入操作 ==========
int insert(T entity);
// ========== 刪除操作 ==========
int deleteById(Serializable id);
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// ========== 更新操作 ==========
int updateById(@Param(Constants.ENTITY) T entity);
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
// ========== 查詢操作 ==========
T selectById(Serializable id);
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// ========== 分頁查詢 ==========
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}2. 插入操作(Insert)
2.1 基本插入方法
// Mapper接口定義
public interface UserMapper extends BaseMapper<User> {
// 無需額外聲明,直接使用繼承的方法
}
// 使用示例
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void testInsert() {
User user = new User();
user.setName("張三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
// 插入一條記錄
int result = userMapper.insert(user);
System.out.println("插入結(jié)果: " + result); // 影響行數(shù)
System.out.println("自增ID: " + user.getId()); // 自動回填主鍵
}
}2.2 插入相關(guān)配置
// 實(shí)體類配置示例
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO) // 自增主鍵
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT) // 自動填充
private LocalDateTime createTime;
}3. 刪除操作(Delete)
3.1 根據(jù)ID刪除
// 根據(jù)主鍵刪除
public void testDeleteById() {
// 刪除ID為1的用戶
int result = userMapper.deleteById(1L);
System.out.println("刪除行數(shù): " + result);
}
// 批量根據(jù)ID刪除
public void testDeleteBatchIds() {
List<Long> ids = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(ids);
System.out.println("批量刪除行數(shù): " + result);
}3.2 條件刪除
// 根據(jù)Map條件刪除
public void testDeleteByMap() {
Map<String, Object> condition = new HashMap<>();
condition.put("name", "張三"); // name = '張三'
condition.put("age", 25); // AND age = 25
int result = userMapper.deleteByMap(condition);
System.out.println("條件刪除行數(shù): " + result);
}
// 使用Wrapper條件刪除
public void testDeleteByWrapper() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "張三")
.ge(User::getAge, 18); // name = '張三' AND age >= 18
int result = userMapper.delete(wrapper);
System.out.println("Wrapper刪除行數(shù): " + result);
}4. 更新操作(Update)
4.1 根據(jù)ID更新
// 根據(jù)主鍵更新
public void testUpdateById() {
User user = new User();
user.setId(1L);
user.setName("李四");
user.setEmail("lisi@example.com");
int result = userMapper.updateById(user);
System.out.println("更新行數(shù): " + result);
}
4.2 條件更新
// 使用UpdateWrapper進(jìn)行條件更新
public void testUpdateByWrapper() {
// 方法1:實(shí)體 + wrapper
User user = new User();
user.setEmail("updated@example.com");
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("name", "張三") // 條件:name = '張三'
.set("age", 30) // 直接設(shè)置字段值
.setSql("version = version + 1"); // 自定義SQL片段
int result = userMapper.update(user, wrapper);
// 方法2:純wrapper更新(推薦)
LambdaUpdateWrapper<User> lambdaWrapper = new LambdaUpdateWrapper<>();
lambdaWrapper.eq(User::getName, "張三")
.set(User::getAge, 30)
.set(User::getEmail, "updated@example.com");
int result2 = userMapper.update(null, lambdaWrapper);
}5. 查詢操作(Select)
5.1 根據(jù)ID查詢
// 基本ID查詢
public void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println("查詢結(jié)果: " + user);
}
// 批量ID查詢
public void testSelectBatchIds() {
List<Long> ids = Arrays.asList(1L, 2L, 3L, 4L);
List<User> users = userMapper.selectBatchIds(ids);
System.out.println("批量查詢結(jié)果: " + users.size());
}5.2 條件查詢
// 根據(jù)Map條件查詢
public void testSelectByMap() {
Map<String, Object> condition = new HashMap<>();
condition.put("name", "張三");
condition.put("status", 1);
List<User> users = userMapper.selectByMap(condition);
System.out.println("Map條件查詢: " + users);
}
// 查詢單條記錄
public void testSelectOne() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "張三");
User user = userMapper.selectOne(wrapper); // 必須確保結(jié)果唯一
System.out.println("單條查詢: " + user);
}
// 查詢數(shù)量
public void testSelectCount() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge, 18); // 年齡 >= 18
Long count = userMapper.selectCount(wrapper);
System.out.println("滿足條件的記錄數(shù): " + count);
}5.3 復(fù)雜查詢示例
// 復(fù)雜條件查詢
public void testComplexQuery() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
// 條件組合
wrapper.select(User::getId, User::getName, User::getAge) // 指定查詢字段
.like(User::getName, "張") // 模糊查詢
.between(User::getAge, 18, 30) // 范圍查詢
.isNotNull(User::getEmail) // 非空查詢
.in(User::getStatus, Arrays.asList(1, 2, 3)) // IN查詢
.orderByDesc(User::getCreateTime) // 排序
.last("LIMIT 10"); // 自定義SQL后綴
List<User> users = userMapper.selectList(wrapper);
System.out.println("復(fù)雜查詢結(jié)果: " + users);
}
// 查詢特定字段
public void testSelectSpecificFields() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "email") // 只查詢指定字段
.eq("status", 1);
List<User> users = userMapper.selectList(wrapper);
}
// 查詢?yōu)镸ap列表
public void testSelectMaps() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getId, User::getName)
.ge(User::getAge, 18);
List<Map<String, Object>> mapList = userMapper.selectMaps(wrapper);
// 結(jié)果: [{"id":1, "name":"張三"}, {"id":2, "name":"李四"}]
}6. 分頁查詢
6.1 基本分頁配置
// 配置分頁插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}6.2 分頁查詢使用
// 分頁查詢示例
public void testSelectPage() {
// 創(chuàng)建分頁對象:查詢第1頁,每頁10條
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge, 18)
.orderByDesc(User::getCreateTime);
// 執(zhí)行分頁查詢
Page<User> result = userMapper.selectPage(page, wrapper);
System.out.println("總記錄數(shù): " + result.getTotal());
System.out.println("總頁數(shù): " + result.getPages());
System.out.println("當(dāng)前頁數(shù)據(jù): " + result.getRecords());
System.out.println("是否有下一頁: " + result.hasNext());
}
// Map分頁查詢
public void testSelectMapsPage() {
Page<Map<String, Object>> page = new Page<>(1, 10);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "age")
.ge("age", 18);
Page<Map<String, Object>> result = userMapper.selectMapsPage(page, wrapper);
// 結(jié)果處理
result.getRecords().forEach(map -> {
System.out.println("ID: " + map.get("id") + ", Name: " + map.get("name"));
});
}7. 自定義方法擴(kuò)展
7.1 自定義SQL方法
// 在BaseMapper基礎(chǔ)上擴(kuò)展自定義方法
public interface UserMapper extends BaseMapper<User> {
// 自定義查詢方法
@Select("SELECT * FROM user WHERE age > #{minAge} AND age < #{maxAge}")
List<User> selectByAgeRange(@Param("minAge") Integer minAge,
@Param("maxAge") Integer maxAge);
// 自定義更新方法
@Update("UPDATE user SET email = #{email} WHERE name = #{name}")
int updateEmailByName(@Param("name") String name,
@Param("email") String email);
// 復(fù)雜查詢方法
List<User> selectComplexUsers(@Param("name") String name,
@Param("minAge") Integer minAge,
@Param("statusList") List<Integer> statusList);
}7.2 對應(yīng)的XML配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectComplexUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
<if test="minAge != null">AND age >= #{minAge}</if>
<if test="statusList != null and statusList.size() > 0">
AND status IN
<foreach collection="statusList" item="status" open="(" separator="," close=")">
#{status}
</foreach>
</if>
</where>
</select>
</mapper>8. 完整使用示例
8.1 完整服務(wù)類示例
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
/**
* 完整的CRUD操作示例
*/
public void completeCrudExample() {
// 1. 插入
User newUser = new User();
newUser.setName("測試用戶");
newUser.setAge(20);
newUser.setEmail("test@example.com");
userMapper.insert(newUser);
Long userId = newUser.getId();
// 2. 查詢
User dbUser = userMapper.selectById(userId);
System.out.println("插入后查詢: " + dbUser);
// 3. 更新
dbUser.setAge(25);
userMapper.updateById(dbUser);
// 4. 條件查詢
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.between(User::getAge, 20, 30)
.orderByDesc(User::getId);
List<User> users = userMapper.selectList(wrapper);
// 5. 分頁查詢
Page<User> page = new Page<>(1, 5);
Page<User> pageResult = userMapper.selectPage(page, wrapper);
// 6. 刪除
userMapper.deleteById(userId);
}
/**
* 批量操作示例
*/
public void batchOperationExample() {
// 批量插入
List<User> userList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
User user = new User();
user.setName("批量用戶" + i);
user.setAge(20 + i);
userList.add(user);
}
// 注意:BaseMapper沒有批量插入方法,需要自定義或使用Service的saveBatch
userList.forEach(userMapper::insert);
// 批量刪除
List<Long> ids = userList.stream()
.map(User::getId)
.collect(Collectors.toList());
userMapper.deleteBatchIds(ids);
}
}9. 最佳實(shí)踐建議
- 簡單CRUD:直接使用BaseMapper提供的方法
- 復(fù)雜查詢:使用Wrapper構(gòu)建查詢條件
- 分頁查詢:配置分頁插件后使用selectPage方法
- 自定義SQL:在BaseMapper基礎(chǔ)上擴(kuò)展自定義方法
- 事務(wù)管理:在Service層使用@Transactional注解
- 自動填充:利用@TableField(fill)實(shí)現(xiàn)自動填充
- 邏輯刪除:使用@TableLogic實(shí)現(xiàn)邏輯刪除
- 樂觀鎖:使用@Version實(shí)現(xiàn)樂觀鎖控制
MyBatis-Plus的BaseMapper提供了豐富的開箱即用方法,可以滿足95%以上的日常開發(fā)需求。通過合理使用這些方法,可以顯著提高開發(fā)效率,減少重復(fù)代碼編寫。
到此這篇關(guān)于MyBatis-Plus Mapper 接口方法詳解的文章就介紹到這了,更多相關(guān)MyBatis-Plus Mapper 接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟
項(xiàng)目用到了過濾器,可能有的人會不理解,之所以用過濾器是因?yàn)橄胍谌罩居涗沺ost請求的json數(shù)據(jù)。本文重點(diǎn)給大家介紹springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧2021-12-12
java 反射getClass .class 的使用方法示例
這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實(shí)例形式分析了java類反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
Spring事務(wù)中的事務(wù)傳播行為使用方式詳解
Spring框架作為一個(gè)輕量級的開源框架,在企業(yè)應(yīng)用開發(fā)中被廣泛使用,在Spring事務(wù)管理中,事務(wù)傳播行為是非常重要的一部分,它定義了方法如何參與到已經(jīng)存在的事務(wù)中或者如何開啟新的事務(wù),本文將詳細(xì)介紹Spring事務(wù)中的幾種事務(wù)傳播行為,詳細(xì)講解具體使用方法2023-06-06
Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例
這篇文章主要介紹了Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例,本文對比測試了FileInputStream 或者FileOutputStream 抑或RandomAccessFile的頻繁讀寫操作,最后總結(jié)出映射到內(nèi)存后進(jìn)行讀寫以提高速度,需要的朋友可以參考下2015-01-01
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(15)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
Java控制臺輸入數(shù)組并逆序輸出的方法實(shí)例
這篇文章主要介紹了Java手動輸入數(shù)組并逆向輸出的方法實(shí)例,需要的朋友可以參考下。2017-08-08
解決fastjson從1.1.41升級到1.2.28后報(bào)錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報(bào)錯問題詳解,需要的朋友可以參考下2020-02-02
springboot統(tǒng)一異常處理(返回json)并格式化異常
這篇文章主要介紹了springboot統(tǒng)一異常處理(返回json)并格式化異常,對spring boot的默認(rèn)異常處理方式進(jìn)行修改,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應(yīng)用,需要的朋友可以參考下2023-07-07

