MyBatisPlus之CRUD接口—IService与BaseMapper
MyBatisPlus(MP)的核心优势之一是提供了开箱即用的CRUD接口,通过BaseMapper(DAO层)和IService(Service层)封装了单表操作的常用方法,无需编写SQL即可完成大部分数据库操作。
一、BaseMapper与IService的关系
在MyBatisPlus中,BaseMapper和IService是实现CRUD操作的两大核心接口,二者分工明确又相互配合:
- BaseMapper:位于DAO层,直接与数据库交互,提供基础的CRUD方法(如
insert、selectById),需由用户自定义的Mapper接口继承。 - IService:位于Service层,基于
BaseMapper封装了更丰富的业务方法(如批量操作、分页查询),并提供事务支持,需由用户自定义的Service接口继承。
调用关系:IService的实现类(如ServiceImpl)会注入BaseMapper实例,通过调用BaseMapper的方法完成数据库操作,同时添加业务逻辑和事务控制。
使用建议:
- 简单查询直接使用
BaseMapper; - 复杂业务(如批量操作、事务管理)优先使用
IService; - 自定义SQL通过
BaseMapper的方法扩展。
二、BaseMapper核心方法详解
BaseMapper<T>是MP的基础接口,泛型T为实体类类型。所有自定义Mapper接口只需继承它,即可获得17个基础CRUD方法。
2.1 新增操作(Insert)
| 方法签名 | 功能描述 | 示例 |
|---|---|---|
int insert(T entity) |
插入一条记录 | userMapper.insert(user) |
说明:
- 插入时会根据实体类的注解(如
@TableId)自动处理主键生成; - 若字段未设置值,会插入
null(除非配置了自动填充); - 返回值为受影响的行数(成功插入返回1)。
示例:
User user = new User();
user.setUsername("张三");
user.setAge(20);
user.setEmail("zhangsan@example.com");
int rows = userMapper.insert(user); // 插入成功后,user.getId()会自动回填主键
System.out.println("插入行数:" + rows + ",生成ID:" + user.getId());
2.2 查询操作(Select)
BaseMapper提供了7种查询方法,覆盖单条查询、批量查询、条件查询等场景:
| 方法签名 | 功能描述 | 适用场景 |
|---|---|---|
T selectById(Serializable id) |
根据ID查询 | 已知主键的单条查询 |
List<T> selectBatchIds(Collection<?> ids) |
批量查询(根据ID集合) | 批量获取多条记录 |
List<T> selectByMap(Map<String, Object> map) |
根据Map条件查询 | 简单条件查询(键为字段名) |
T selectOne(@Param("ew") Wrapper<T> queryWrapper) |
根据条件查询单条 | 确保结果唯一的查询(如唯一索引) |
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper) |
条件查询总数 | 统计符合条件的记录数 |
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper) |
条件查询列表 | 复杂条件的多条查询 |
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper) |
条件查询(返回Map) | 只需要部分字段,无需实体类 |
示例1:根据ID查询
User user = userMapper.selectById(1L); // ID为1的用户
示例2:批量查询
List<Long> ids = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.selectBatchIds(ids); // 查询ID为1、2、3的用户
示例3:条件查询(使用QueryWrapper)
// 查询年龄≥20且用户名包含"张"的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age", 20) // 年龄≥20
.like("username", "张"); // 用户名含"张"
List<User

最低0.47元/天 解锁文章
1068

被折叠的 条评论
为什么被折叠?



