最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus?Mapper?接口方法操作詳解

 更新時(shí)間:2025年12月15日 09:48:44   作者:倚肆  
MyBatis-Plus的BaseMapper提供了豐富的開箱即用方法,所有方法都不需要編寫SQL即可使用,可以滿足95%以上的日常開發(fā)需求,本文給大家介紹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í)踐建議

  1. 簡單CRUD:直接使用BaseMapper提供的方法
  2. 復(fù)雜查詢:使用Wrapper構(gòu)建查詢條件
  3. 分頁查詢:配置分頁插件后使用selectPage方法
  4. 自定義SQL:在BaseMapper基礎(chǔ)上擴(kuò)展自定義方法
  5. 事務(wù)管理:在Service層使用@Transactional注解
  6. 自動填充:利用@TableField(fill)實(shí)現(xiàn)自動填充
  7. 邏輯刪除:使用@TableLogic實(shí)現(xiàn)邏輯刪除
  8. 樂觀鎖:使用@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ì)步驟

    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 的使用方法示例

    這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實(shí)例形式分析了java類反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Spring事務(wù)中的事務(wù)傳播行為使用方式詳解

    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í)例

    這篇文章主要介紹了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)

    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í)例

    這篇文章主要介紹了Java手動輸入數(shù)組并逆向輸出的方法實(shí)例,需要的朋友可以參考下。
    2017-08-08
  • Spring中的自動裝配機(jī)制詳解

    Spring中的自動裝配機(jī)制詳解

    這篇文章主要介紹了Spring中的自動裝配機(jī)制詳解,自動裝配就是會通過Spring的上下文為你找出相應(yīng)依賴項(xiàng)的類,通俗的說就是Spring會在上下文中自動查找,并自動給Bean裝配與其相關(guān)的屬性,需要的朋友可以參考下
    2023-08-08
  • 解決fastjson從1.1.41升級到1.2.28后報(bào)錯問題詳解

    解決fastjson從1.1.41升級到1.2.28后報(bào)錯問題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報(bào)錯問題詳解,需要的朋友可以參考下
    2020-02-02
  • java時(shí)間日期使用與查詢代碼詳解

    java時(shí)間日期使用與查詢代碼詳解

    這篇文章主要介紹了java時(shí)間日期使用與查詢代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • springboot統(tǒng)一異常處理(返回json)并格式化異常

    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

最新評論

蕉岭县| 伊宁市| 通化市| 灵山县| 桓仁| 格尔木市| 黔江区| 梧州市| 平阴县| 乾安县| 泽普县| 颍上县| 耿马| 巴东县| 满洲里市| 卓尼县| 吕梁市| 沅江市| 龙陵县| 华容县| 慈利县| 高邮市| 莆田市| 聊城市| 兴文县| 鹤山市| 茂名市| 平南县| 杭州市| 东丽区| 芒康县| 罗田县| 上饶县| 乐安县| 定兴县| 称多县| 汾阳市| 化州市| 尼玛县| 托里县| 贺州市|