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

MyBatis-Plus 深度解析:IService 接口全指南

关键词:MyBatis-Plus、IService、ServiceImpl、CRUD、Java、ORM


一、什么是 IService?

com.baomidou.mybatisplus.extension.service.IService<T> 是 MyBatis-Plus 提供的 通用 Service 层接口,用于封装常见的 CRUD 操作,简化业务逻辑层的开发。

它是 MyBatis-Plus 三层架构封装 的一部分:

层级MyBatis-Plus 封装
Controller无封装,自行编写
ServiceIService<T> + ServiceImpl<M, T>
MapperBaseMapper<T>

二、核心功能概览

IService<T> 提供了 30+ 个常用方法,覆盖单表操作的 90% 场景:

类别方法示例说明
插入save(T) / saveBatch(List<T>)单条或批量插入
删除removeById() / remove(Wrapper)按 ID 或条件删除
更新updateById() / update(Wrapper)按 ID 或条件更新
查询getById() / list() / page()单条、列表、分页
统计count() / count(Wrapper)总记录数或条件统计
存在exist(Wrapper)判断是否存在记录

三、快速上手

1. 实体类

@Data
public class User {private Long id;private String name;private Integer age;
}

2. Mapper 接口

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

3. Service 接口

public interface UserService extends IService<User> {// 可扩展自定义方法
}

4. Service 实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService {// 自动拥有 IService 的所有实现
}

5. 使用示例

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User get(@PathVariable Long id) {return userService.getById(id);}@PostMappingpublic boolean add(@RequestBody User user) {return userService.save(user);}@GetMapping("/page")public IPage<User> page(@RequestParam int current, @RequestParam int size) {return userService.page(new Page<>(current, size));}
}

四、IService 方法全景图(含重载)

以下方法均以 default 实现,可直接调用。

方法签名说明
boolean save(T entity)插入一条记录
boolean saveBatch(Collection<T> entityList)批量插入(默认批次大小 1000)
boolean saveBatch(Collection<T> list, int batchSize)指定批次大小
boolean removeById(Serializable id)按 ID 删除
boolean removeByMap(Map<String,Object> columnMap)按字段 Map 删除
boolean remove(Wrapper<T> queryWrapper)按条件删除
boolean updateById(T entity)按 ID 更新
boolean update(T entity, Wrapper<T> updateWrapper)按条件更新
T getById(Serializable id)按 ID 查询
T getOne(Wrapper<T> queryWrapper)按条件查询一条
List<T> list()查询所有
List<T> list(Wrapper<T> queryWrapper)按条件查询列表
IPage<T> page(IPage<T> page)无条件分页
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper)按条件分页
int count()总记录数
int count(Wrapper<T> queryWrapper)按条件统计
boolean exist(Wrapper<T> queryWrapper)判断是否存在

五、与 ServiceImpl 的关系

接口实现类说明
IService<T>仅定义方法无实现,需配合 ServiceImpl
ServiceImpl<M extends BaseMapper<T>, T>提供所有 IService 的默认实现泛型指定 Mapper 和实体

最佳实践
自定义 Service 接口继承 IService<T>,实现类继承 ServiceImpl<YourMapper, T> 并实现自定义接口。


六、自定义扩展:在 Service 中写复杂业务

public interface UserService extends IService<User> {/*** 根据姓名模糊查询并分页*/IPage<User> searchByName(String keyword, int current, int size);
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService {@Overridepublic IPage<User> searchByName(String keyword, int current, int size) {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.like(User::getName, keyword);return page(new Page<>(current, size), wrapper);}
}

七、事务支持

IService 的所有方法默认 未加事务,如需事务,请在 实现类方法 上加 @Transactional

@Transactional(rollbackFor = Exception.class)
public boolean transferMoney(Long from, Long to, BigDecimal amount) {// 自定义业务
}

八、性能与批量操作建议

场景建议
批量插入使用 saveBatch(list, 500),控制批次大小
大批量更新避免循环 updateById,考虑手写 SQL 或 MP 的 UpdateWrapper
分页查询使用 Page<T> 对象,MP 自动执行 count 和 limit
避免 N+1关联查询使用 @TableField(el = "...") 或 VO + 手写 SQL

九、常见问题 FAQ

问题解答
可以不加 Mapper 吗?不可以,ServiceImpl 需要 BaseMapper 才能工作
可以多个实体复用一个 Service 吗?不建议,一个 IService<T> 对应一个实体
可以注入原生 SqlSession 吗?可以,通过 baseMapper.getSqlStatement()@Autowired SqlSessionFactory
可以切换数据源吗?可以,配合动态数据源插件(如 dynamic-datasource-spring-boot-starter

十、总结:一句话记住 IService

IService<T> 是 MyBatis-Plus 提供的 Service 层“神器”,让你 不写 SQL、不写重复 CRUD,专注业务逻辑,配合 ServiceImpl 即可一键拥有强大且可扩展的 Service 层


十一、参考资料

  • MyBatis-Plus 官方文档:https://baomidou.com
  • GitHub 源码:https://github.com/baomidou/mybatis-plus
  • 示例项目:https://gitee.com/baomidou/mybatis-plus-samples

文章转载自:

http://LnuQRcvp.cwjsz.cn
http://li0wM00X.cwjsz.cn
http://SQRfU9PE.cwjsz.cn
http://CxGHCdWV.cwjsz.cn
http://6Pnj0JXm.cwjsz.cn
http://EGcLXa8y.cwjsz.cn
http://7HbRXnS3.cwjsz.cn
http://g55Gwe6f.cwjsz.cn
http://4CmRAjwb.cwjsz.cn
http://AYa8Tvcc.cwjsz.cn
http://uuWIKoT6.cwjsz.cn
http://Mj3B9uuJ.cwjsz.cn
http://GuI1Ve5W.cwjsz.cn
http://DbWXfbAA.cwjsz.cn
http://A2H84BNs.cwjsz.cn
http://b8BI1G4o.cwjsz.cn
http://H5xjHuNB.cwjsz.cn
http://gNiiNOD4.cwjsz.cn
http://sHY8HGNq.cwjsz.cn
http://AvlsWPl2.cwjsz.cn
http://0BPXHI7a.cwjsz.cn
http://T8wZeEVc.cwjsz.cn
http://JxXUqwI2.cwjsz.cn
http://ViVhoanw.cwjsz.cn
http://rcEgcNVg.cwjsz.cn
http://7C36Nnqs.cwjsz.cn
http://PSxATBlI.cwjsz.cn
http://wtn9z8ME.cwjsz.cn
http://DfDDC9y6.cwjsz.cn
http://KxIL30QQ.cwjsz.cn
http://www.dtcms.com/a/374216.html

相关文章:

  • iPaaS 如何帮助 CIO 减少 50% 的集成成本?
  • [运动控制]PID算法再深入--多环组合控制
  • llm的一点学习笔记
  • JVM详解(一)--JVM和Java体系结构
  • Java字符串处理:String、StringBuilder与StringBuffer
  • SQL 注入与防御-第十章:确认并从 SQL 注入攻击中恢复
  • MCP(模型上下文协议)入门教程1
  • 已知两个平面点的坐标、切线方向、曲率,构造三阶Bezier曲线的方法
  • STM32添加库函数
  • Python 示例(Tkinter)
  • 学习如何基于ACP-SDK构建多智能体系统
  • Dify 从入门到精通(第 83/100 篇):Dify 的多模态模型性能调优(高级篇)
  • 【docker】镜像制作
  • 前端安全攻防:XSS, CSRF 等防范与检测
  • Unity鱼眼特效
  • MySQL表结构优化:安全删除字段(DROP COLUMN)的完整指南与避坑手册
  • Java全栈技术选型指南
  • Leptos框架深度解析:用Rust构建高性能Web应用的未来
  • 嵌入式学习day45-硬件—汇编
  • Gazebo1: gz命令工具理解与掌握
  • 电路运行的核心-RTC
  • 高并发下的锁选择:乐观锁 vs 悲观锁全面对比
  • 本地部署大模型和知识库实现问答AI
  • python编程:一文掌握pypiserver的详细使用
  • 【人工智能99问】开源项目RAGflow_by_infiniflow介绍(37/99)
  • Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题​之一
  • 一种高效绘制余晖波形的方法Qt/C++
  • 本地部署的Qwen3,测试不同数量并发请求的吞吐量
  • 【从零开始java学习|第十三篇】字符串究极知识总结
  • Linux内核进程管理子系统有什么第四十六回 —— 进程主结构详解(42)