当前位置: 首页 > news >正文

深入理解 MyBatis-Plus 的 `BaseMapper`

在使用 MyBatis-Plus(简称 MP)时,开发者几乎一定会接触到 BaseMapper 接口。它是 MP 的核心功能之一,提供了单表的基础 CRUD 操作,极大地减少了样板代码的编写工作。本文将详细介绍 BaseMapper 的作用、常用方法、源码解析以及最佳实践。


1. BaseMapper 简介

BaseMapper<T> 是 MyBatis-Plus 提供的一个 通用 Mapper 接口,泛型参数 T 指定实体类类型。

它的设计初衷是:让开发者无需编写 XML 或额外的 SQL,即可直接使用基础的 增删改查方法

定义位置

package com.baomidou.mybatisplus.core.mapper;public interface BaseMapper<T> extends Mapper<T> {// 内置了丰富的 CRUD 方法
}

只要你的 Mapper 接口继承了 BaseMapper<T>,并指定了对应的实体类,就能直接调用这些 CRUD 方法。例如:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2. 常用方法一览

BaseMapper 内置了近 20 个常用方法,主要涵盖了 增、删、改、查

(1)插入

int insert(T entity);
  • 功能:插入一条记录
  • 特点:只插入非 null 字段,支持自增主键回填

(2)删除

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.COLL) Collection<? extends Serializable> idList);
  • deleteById:根据主键删除
  • deleteBatchIds:批量删除
  • deleteByMap:通过 Map<列名, 值> 删除
  • delete(Wrapper):条件删除(支持 LambdaQueryWrapper)

(3)更新

int updateById(@Param(Constants.ENTITY) T entity);
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
  • updateById:根据主键更新,null 值字段会被更新为 null
  • update:条件更新,配合 UpdateWrapper 使用

(4)查询

T selectById(Serializable id);
List<T> selectBatchIds(@Param(Constants.COLL) 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);
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  • 单条查询selectById, selectOne
  • 批量查询selectBatchIds, selectList
  • 分页查询selectPage, selectMapsPage
  • 统计selectCount
  • Map 查询:返回 Map<String, Object>,适合动态表格场景

3. 使用示例

假设我们有一个 User 实体类:

@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;
}

对应的 UserMapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

插入

User user = new User();
user.setName("张三");
user.setAge(20);
userMapper.insert(user); // 返回插入条数

删除

userMapper.deleteById(1L);
userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L));
userMapper.delete(new QueryWrapper<User>().eq("age", 20));

更新

User user = userMapper.selectById(1L);
user.setAge(25);
userMapper.updateById(user);userMapper.update(new User(), new UpdateWrapper<User>().set("age", 30).eq("name", "张三"));

查询

User user = userMapper.selectById(1L);List<User> users = userMapper.selectList(new QueryWrapper<User>().ge("age", 18));Page<User> page = new Page<>(1, 10);
IPage<User> userPage = userMapper.selectPage(page, new QueryWrapper<User>().orderByDesc("id"));

4. 源码解析

BaseMapper 的方法本质上并没有具体实现,而是由 MyBatis-Plus 内置的 SQL 注入器 生成。

  • 默认使用 DefaultSqlInjector
  • 会自动为每个方法拼接对应 SQL
  • 所有方法底层最终都会映射到 XML 或内置 SQL 语句

举例:insert(T entity) 对应的 SQL 类似:

INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})

5. 使用注意事项

  1. 批量操作性能

    • insert 是逐条执行,不是批量插入
    • 建议使用 saveBatch(来自 IService)或自定义 SQL 提升性能
  2. 空值更新

    • updateById 会将 null 字段更新为 null
    • 如果想忽略 null 值,可以使用 UpdateWrapper.set()
  3. 多表查询

    • BaseMapper 仅支持单表操作
    • 多表需要写自定义 SQL 或使用 @Select 注解
  4. Wrapper 灵活性

    • 推荐使用 LambdaQueryWrapper / LambdaUpdateWrapper 避免硬编码列名

    • 例如:

      new LambdaQueryWrapper<User>().eq(User::getName, "张三");
      

6. 总结

  • BaseMapper<T> 是 MyBatis-Plus 提供的核心接口
  • 内置丰富的 CRUD 方法,省去了大量模板代码
  • 搭配 Wrapper 可实现灵活查询
  • 局限性:仅支持单表,复杂场景需自定义 SQL

文章转载自:

http://pHQ1jgXx.Lbhnj.cn
http://I0qn5kX0.Lbhnj.cn
http://638ophyF.Lbhnj.cn
http://CnQxJk6E.Lbhnj.cn
http://U8sComwk.Lbhnj.cn
http://XW7S0tyW.Lbhnj.cn
http://f313iDYa.Lbhnj.cn
http://bxsvZhVl.Lbhnj.cn
http://liDlTFzT.Lbhnj.cn
http://UUyhANb7.Lbhnj.cn
http://Zd7nV7PV.Lbhnj.cn
http://LiaXsrRY.Lbhnj.cn
http://zFudQhMW.Lbhnj.cn
http://lxAYNUms.Lbhnj.cn
http://BeDBaKon.Lbhnj.cn
http://Oqbjm7Fe.Lbhnj.cn
http://dPk4fz6a.Lbhnj.cn
http://k9BNuasE.Lbhnj.cn
http://kZw2FECY.Lbhnj.cn
http://bwHB4PHD.Lbhnj.cn
http://tojmksZg.Lbhnj.cn
http://Gc6GzleU.Lbhnj.cn
http://dPfQV0fs.Lbhnj.cn
http://WC0ylbVI.Lbhnj.cn
http://gRQu72IP.Lbhnj.cn
http://qSNgOSjC.Lbhnj.cn
http://nNufHTFd.Lbhnj.cn
http://qaKEmbmN.Lbhnj.cn
http://1OkScCvX.Lbhnj.cn
http://uKaEeR3L.Lbhnj.cn
http://www.dtcms.com/a/373992.html

相关文章:

  • YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线
  • HTML HTML基础(3)
  • 几何动点问题
  • C++从字符串中移除前导零
  • PPP PRIVATE NETWORK™ 2 企业级虚拟以太网接入综合解决方案介绍
  • 《会“偷听”的石头:声流石的震撼发现》
  • 线程的控制(互斥+同步)
  • SpringBoot中添加健康检查服务
  • Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
  • Skopeo 工具介绍与 CentOS 7 安装指南
  • 面向对象设计原则(未完)
  • Python数据挖掘实战:从理论到工具
  • Highcharts 数据源安全最佳实践:保障数据安全,助力可视化可信部署
  • 网易有道-虚拟人口语教练
  • git config user.name “xxx“命名报错fatal: not in a git directory
  • 【Flask】测试平台开发,工具模块开发 第二十二篇
  • 【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
  • 2025最新超详细FreeRTOS入门教程:第七章 FreeRTOS事件组
  • 【nest.js】创建一个上传api
  • C语言内存精讲系列(八):深化详述 int 3
  • 蓓韵安禧DHA为孕期安全营养补充提供科学支持,呵护母婴健康
  • 什么是状态(State)以及如何在React中管理状态?
  • Anaconda与Jupyter 安装和使用
  • 房屋安全鉴定需要什么条件
  • 全国产压力传感器选型指南/选型手册
  • 时间比较算法(SMART PLC梯形图示例)
  • 查找---二分查找
  • 求解二次方程
  • ArcGISPro应用指南:使用ArcGIS Pro制作弧线OD图
  • ZYNQ EMMC