MyBatis 与 MyBatis-Plus 在 Spring Boot 项目中的核心区别详解
一、核心概念对比
特性 | MyBatis | MyBatis-Plus |
---|---|---|
定位 | 基础持久层框架,提供 SQL 与对象映射能力 | MyBatis 的增强工具,提供开箱即用的扩展功能 |
设计原则 | 高度灵活,需手动编写 SQL 和映射逻辑 | 约定优于配置,通过封装简化开发流程 |
代码侵入性 | 低侵入性,仅提供核心映射能力 | 通过继承和注解增强,对原有代码结构有一定侵入 |
核心目标 | 解决 JDBC 冗余代码,实现 SQL 与代码解耦 | 在 MyBatis 基础上减少模板代码,提升开发效率 |
二、核心功能对比
1. 基础 CRUD 实现
-
MyBatis
需手动编写 XML 或注解形式的 SQL 语句,并为每个实体类定义对应的 Mapper 接口方法:<!-- UserMapper.xml --> <insert id="insertUser" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert>
public interface UserMapper { int insertUser(User user); }
-
MyBatis-Plus
提供通用 Mapper 接口(BaseMapper<T>
),内置常见 CRUD 方法,无需编写 SQL:public interface UserMapper extends BaseMapper<User> {} // 直接调用内置方法 userMapper.insert(user); userMapper.selectById(1);
2. 条件构造器
-
MyBatis
需手动拼接 SQL 或使用动态 SQL 标签(如<if>
,<where>
):<select id="selectUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select>
-
MyBatis-Plus
提供QueryWrapper
或LambdaQueryWrapper
,支持链式调用和类型安全的条件构建:QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "John").ge("age", 18); List<User> users = userMapper.selectList(wrapper); // Lambda 写法(避免硬编码字段名) LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "John").ge(User::getAge, 18);
3. 分页插件
-
MyBatis
需手动实现分页逻辑(计算limit
和offset
)或集成第三方分页插件(如 PageHelper):// PageHelper 示例 PageHelper.startPage(1, 10); List<User> users = userMapper.selectUsers(); PageInfo<User> pageInfo = new PageInfo<>(users);
-
MyBatis-Plus
内置分页插件,通过Page
对象和IPage
接口实现自动分页:// 配置分页插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } // 使用分页查询 Page<User> page = new Page<>(1, 10); IPage<User> userPage = userMapper.selectPage(page, null);
4. 代码生成器
-
MyBatis
需依赖第三方工具(如 MyBatis Generator)生成 Entity、Mapper 和 XML 文件:<!-- generatorConfig.xml --> <table tableName="user" domainObjectName="User"/>
-
MyBatis-Plus
提供AutoGenerator
,可一键生成 Entity、Mapper、Service、Controller 层代码:AutoGenerator generator = new AutoGenerator(); generator.setGlobalConfig(config); generator.setDataSource(dataSourceConfig); generator.setPackageInfo(packageConfig); generator.execute();
三、Spring Boot 集成对比
1. 依赖配置
-
MyBatis
需引入mybatis-spring-boot-starter
并手动配置 Mapper 扫描:<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency>
@MapperScan("com.example.mapper")
-
MyBatis-Plus
引入mybatis-plus-boot-starter
,自动扫描 Mapper:<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency>
2. 实体类映射
-
MyBatis
使用@Result
或 XML 配置字段映射:public class User { private String userName; // getter/setter } <!-- XML 映射 --> <resultMap id="userMap" type="User"> <result column="user_name" property="userName"/> </resultMap>
-
MyBatis-Plus
通过注解自动映射(支持驼峰和下划线自动转换):@TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String userName; // 自动映射到 user_name 字段 }
3. 事务管理
- 两者均与 Spring 事务无缝集成:
@Transactional public void updateUser(User user) { userMapper.updateById(user); }
四、高级功能对比
功能 | MyBatis | MyBatis-Plus |
---|---|---|
逻辑删除 | 需手动实现 | 通过 @TableLogic 注解自动处理 |
字段自动填充 | 需自定义拦截器 | 支持 @TableField(fill = FieldFill.INSERT) |
多租户支持 | 需自定义插件 | 内置多租户插件(TenantLineInnerInterceptor ) |
SQL 注入器 | 不支持 | 支持自定义全局 SQL 方法(如 deleteAll() ) |
五、优缺点对比
维度 | MyBatis | MyBatis-Plus |
---|---|---|
灵活性 | 极高,可完全控制 SQL 和映射逻辑 | 较高,但对复杂 SQL 仍需手动编写 |
开发效率 | 低,需编写大量模板代码 | 高,内置功能减少 80% 的重复工作 |
学习成本 | 较高,需掌握 XML 配置和动态 SQL | 较低,约定优于配置,API 直观易用 |
社区生态 | 成熟稳定,社区资源丰富 | 活跃度高,持续迭代新功能 |
六、适用场景建议
-
选择 MyBatis 的情况
- 需要高度定制复杂 SQL(如多表关联、存储过程调用)
- 已有成熟项目需保持技术栈稳定
- 团队对 MyBatis 有深度优化经验
-
选择 MyBatis-Plus 的情况
- 快速开发标准 CRUD 功能(如后台管理系统)
- 希望减少重复代码,提升开发效率
- 需要开箱即用的分页、逻辑删除等通用功能
七、实战代码对比
场景:查询年龄大于 18 岁的用户
-
MyBatis 实现
<select id="selectAdults" resultType="User"> SELECT * FROM user WHERE age > 18 </select>
List<User> adults = userMapper.selectAdults();
-
MyBatis-Plus 实现
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.gt("age", 18); List<User> adults = userMapper.selectList(wrapper);
八、总结
MyBatis 和 MyBatis-Plus 在 Spring Boot 项目中的核心差异可总结为以下几点:
- 开发效率:MyBatis-Plus 通过封装通用操作显著减少模板代码。
- 功能扩展:MyBatis-Plus 提供逻辑删除、自动填充等企业级功能。
- 灵活性:MyBatis 在处理复杂 SQL 时更具优势。
选择建议:
- 新项目优先考虑 MyBatis-Plus,快速实现基础功能。
- 复杂查询场景保留 MyBatis 的灵活性,两者可混合使用。
通过合理选择工具,可在保证代码质量的前提下,最大化提升开发效率。