一、核心定位与设计哲学
MyBatis
定位:轻量级ORM框架,核心解决SQL与Java对象的映射问题,强调开发者对SQL的完全控制权。
设计哲学:
灵活性优先:通过XML或注解直接编写原生SQL,适合复杂查询和高度定制化场景。
解耦数据库操作:将SQL与Java代码分离,便于DBA参与SQL优化。
典型场景:金融系统、数据分析等需要复杂SQL优化的领域。
MyBatis-Plus
定位:MyBatis的增强工具,核心目标是简化CRUD操作,提高开发效率。
设计哲学:
约定优于配置:通过默认规则(如表名映射、字段命名策略)减少配置。
开箱即用:提供通用Mapper、分页插件、代码生成器等模块。
典型场景:快速开发后台管理系统、中小型微服务项目。
二、架构与核心功能对比
特性 | MyBatis | MyBatis-Plus |
---|---|---|
SQL控制 | 手动编写SQL | 支持Lambda表达式、条件构造器生成SQL |
CRUD接口 | 需手动定义Mapper接口与XML | 内置BaseMapper提供通用CRUD方法 |
代码生成 | 需集成第三方工具(如MyBatis Generator) | 内置代码生成器,支持Freemarker模板 |
分页插件 | 需手动实现或集成PageHelper | 原生支持分页插件,API更简洁 |
多租户支持 | 需自行实现逻辑 | 内置多租户插件(@SqlParser注解) |
乐观锁机制 | 需手动实现版本控制 | 支持@Version注解自动处理 |
技术细节对比:
条件构造器(QueryWrapper):
MyBatis-Plus的QueryWrapper允许链式调用构建动态查询条件,避免SQL注入风险。例如:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "John").between("age", 20, 30).orderByDesc("create_time");
List<User> users = userMapper.selectList(wrapper);
而MyBatis需手动拼接SQL或使用动态SQL标签(如)。
性能优化:
MyBatis-Plus的SelectById方法在底层通过缓存机制(如二级缓存)优化单条查询,而复杂查询仍需依赖MyBatis原生执行逻辑。
三、部署与配置实践
1、依赖管理
MyBatis:
仅需核心依赖,适合对包体积敏感的项目:
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>
MyBatis-Plus:
需引入增强包,并排除MyBatis原生依赖以避免版本冲突:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions>
</dependency>
2、配置差异
数据源配置:
两者均支持Spring Boot的application.yml配置,但MyBatis-Plus扩展了更多参数:
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: auto # 自增主键策略
XML扫描路径:
MyBatis需明确指定mapper-locations,而MyBatis-Plus默认扫描/mapper/**/*.xml。
3、动态数据源与多租户
**MyBatis:**需集成第三方库(如Dynamic-Datasource)或手动实现AbstractRoutingDataSource。
**MyBatis-Plus:**通过@DS(“slave”)注解实现多数据源切换,结合@SqlParser(filter = true)过滤租户条件。
4、监控与调试
**MyBatis:**依赖P6Spy等工具拦截SQL日志。
**MyBatis-Plus:**内置PerformanceInterceptor插件,可输出完整执行计划。
四、生产环境中的性能与稳定性
1、缓存机制对比
MyBatis提供一级(Session级)和二级(Mapper级)缓存,但需手动管理缓存失效策略。
MyBatis-Plus在通用方法中默认启用二级缓存,但在高并发场景下需谨慎配置@CacheNamespace注解。
2、批量操作优化
MyBatis:
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper mapper = session.getMapper(UserMapper.class);
for (User user : userList) {mapper.insert(user);
}
session.commit();
MyBatis-Plus:
提供saveBatch()方法自动优化批量提交,底层通过分批插入减少事务开销。
五、适用场景与选型建议
选择MyBatis的情况:
- 项目需要高度定制化的复杂SQL(如多表关联、存储过程调用)。
- 团队有较强的SQL优化能力,且希望完全掌控ORM层逻辑。
选择MyBatis-Plus的情况:
- 快速迭代的中小型项目,需减少重复CRUD代码。
- 需要开箱即用的多租户、乐观锁等企业级特性。
六、总结
MyBatis与MyBatis-Plus并非替代关系,而是互补。在大型项目中,可混合使用:核心模块用MyBatis实现复杂逻辑,边缘服务用MyBatis-Plus提升效率。部署时需重点关注依赖冲突、缓存策略和SQL监控,以平衡灵活性与开发效率。