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

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

 更新時(shí)間:2025年12月15日 09:48:44   作者:倚肆  
MyBatis-Plus的BaseMapper提供了豐富的開(kāi)箱即用方法,所有方法都不需要編寫(xiě)SQL即可使用,可以滿足95%以上的日常開(kāi)發(fā)需求,本文給大家介紹MyBatis-Plus?Mapper?接口方法詳解,感興趣的朋友跟隨小編一起看看吧

MyBatis-Plus Mapper 接口方法詳解

1. BaseMapper 核心方法概覽

MyBatis-Plus 的 BaseMapper<T> 接口提供了豐富的 CRUD 操作方法,所有方法都不需要編寫(xiě) SQL即可使用。

1.1 完整方法列表

方法類(lèi)別方法名說(shuō)明使用場(chǎng)景
插入insert(T entity)插入一條記錄新增數(shù)據(jù)
刪除deleteById(Serializable id)根據(jù)ID刪除按主鍵刪除
deleteBatchIds(Collection ids)批量ID刪除批量刪除
deleteByMap(Map map)根據(jù)Map刪除簡(jiǎn)單條件刪除
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查詢簡(jiǎn)單條件查詢
selectOne(Wrapper wrapper)查詢單條記錄確保結(jié)果唯一時(shí)
selectCount(Wrapper wrapper)查詢記錄數(shù)統(tǒng)計(jì)數(shù)量
selectList(Wrapper wrapper)查詢列表條件查詢
selectMaps(Wrapper wrapper)查詢Map列表只需要部分字段
分頁(yè)selectPage(Page page, Wrapper wrapper)分頁(yè)查詢分頁(yè)數(shù)據(jù)查詢
selectMapsPage(Page page, Wrapper wrapper)Map分頁(yè)查詢分頁(yè)+部分字段
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);
// ========== 分頁(yè)查詢 ==========
<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> {
// 無(wú)需額外聲明,直接使用繼承的方法
}
// 使用示例
@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()); // 自動(dòng)回填主鍵
}
}

2.2 插入相關(guān)配置

// 實(shí)體類(lèi)配置示例
@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)  // 自動(dòng)填充
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. 分頁(yè)查詢

6.1 基本分頁(yè)配置

// 配置分頁(yè)插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}
}

6.2 分頁(yè)查詢使用

// 分頁(yè)查詢示例
public void testSelectPage() {
// 創(chuàng)建分頁(yè)對(duì)象:查詢第1頁(yè),每頁(yè)10條
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge, 18)
      .orderByDesc(User::getCreateTime);
// 執(zhí)行分頁(yè)查詢
Page<User> result = userMapper.selectPage(page, wrapper);
System.out.println("總記錄數(shù): " + result.getTotal());
System.out.println("總頁(yè)數(shù): " + result.getPages());
System.out.println("當(dāng)前頁(yè)數(shù)據(jù): " + result.getRecords());
System.out.println("是否有下一頁(yè): " + result.hasNext());
}
// Map分頁(yè)查詢
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 對(duì)應(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ù)類(lèi)示例

@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
/**
 * 完整的CRUD操作示例
 */
public void completeCrudExample() {
    // 1. 插入
    User newUser = new User();
    newUser.setName("測(cè)試用戶");
    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. 分頁(yè)查詢
    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沒(méi)有批量插入方法,需要自定義或使用Service的saveBatch
    userList.forEach(userMapper::insert);
    // 批量刪除
    List<Long> ids = userList.stream()
        .map(User::getId)
        .collect(Collectors.toList());
    userMapper.deleteBatchIds(ids);
}
}

9. 最佳實(shí)踐建議

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

MyBatis-Plus的BaseMapper提供了豐富的開(kāi)箱即用方法,可以滿足95%以上的日常開(kāi)發(fā)需求。通過(guò)合理使用這些方法,可以顯著提高開(kāi)發(fā)效率,減少重復(fù)代碼編寫(xiě)。

到此這篇關(guān)于MyBatis-Plus Mapper 接口方法詳解的文章就介紹到這了,更多相關(guān)MyBatis-Plus Mapper 接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    項(xiàng)目用到了過(guò)濾器,可能有的人會(huì)不理解,之所以用過(guò)濾器是因?yàn)橄胍谌罩居涗沺ost請(qǐng)求的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類(lèi)反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Spring事務(wù)中的事務(wù)傳播行為使用方式詳解

    Spring事務(wù)中的事務(wù)傳播行為使用方式詳解

    Spring框架作為一個(gè)輕量級(jí)的開(kāi)源框架,在企業(yè)應(yīng)用開(kāi)發(fā)中被廣泛使用,在Spring事務(wù)管理中,事務(wù)傳播行為是非常重要的一部分,它定義了方法如何參與到已經(jīng)存在的事務(wù)中或者如何開(kāi)啟新的事務(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í)例,本文對(duì)比測(cè)試了FileInputStream 或者FileOutputStream 抑或RandomAccessFile的頻繁讀寫(xiě)操作,最后總結(jié)出映射到內(nèi)存后進(jìn)行讀寫(xiě)以提高速度,需要的朋友可以參考下
    2015-01-01
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(15)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(15)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • Java控制臺(tái)輸入數(shù)組并逆序輸出的方法實(shí)例

    Java控制臺(tái)輸入數(shù)組并逆序輸出的方法實(shí)例

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

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

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

    解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解,需要的朋友可以參考下
    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)并格式化異常,對(duì)spring boot的默認(rèn)異常處理方式進(jìn)行修改,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開(kāi)發(fā)應(yīng)用,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

韶山市| 冕宁县| 肇庆市| 杂多县| 张家口市| 左权县| 新巴尔虎左旗| 自贡市| 鄱阳县| 宁海县| 尤溪县| 乌拉特中旗| 云和县| 九龙城区| 扎鲁特旗| 岳普湖县| 涿州市| 普安县| 江阴市| 喀喇| 游戏| 综艺| 冕宁县| 阿拉善左旗| 彭阳县| 得荣县| 苏尼特右旗| 布尔津县| 郓城县| 安国市| 孟津县| 昆山市| 临澧县| 陕西省| 凌源市| 枣庄市| 甘泉县| 龙胜| 怀安县| 西乌珠穆沁旗| 弥渡县|