MyBatis 与 MyBatis-Plus 在Java Spring Boot 项目中的核心区别详解

MyBatis 与 MyBatis-Plus 在 Spring Boot 项目中的核心区别详解


一、核心概念对比
特性MyBatisMyBatis-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
    提供 QueryWrapperLambdaQueryWrapper,支持链式调用和类型安全的条件构建:

    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
    需手动实现分页逻辑(计算 limitoffset)或集成第三方分页插件(如 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);
    }
    

四、高级功能对比
功能MyBatisMyBatis-Plus
逻辑删除需手动实现通过 @TableLogic 注解自动处理
字段自动填充需自定义拦截器支持 @TableField(fill = FieldFill.INSERT)
多租户支持需自定义插件内置多租户插件(TenantLineInnerInterceptor
SQL 注入器不支持支持自定义全局 SQL 方法(如 deleteAll()

五、优缺点对比
维度MyBatisMyBatis-Plus
灵活性极高,可完全控制 SQL 和映射逻辑较高,但对复杂 SQL 仍需手动编写
开发效率低,需编写大量模板代码高,内置功能减少 80% 的重复工作
学习成本较高,需掌握 XML 配置和动态 SQL较低,约定优于配置,API 直观易用
社区生态成熟稳定,社区资源丰富活跃度高,持续迭代新功能

六、适用场景建议
  1. 选择 MyBatis 的情况

    • 需要高度定制复杂 SQL(如多表关联、存储过程调用)
    • 已有成熟项目需保持技术栈稳定
    • 团队对 MyBatis 有深度优化经验
  2. 选择 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 项目中的核心差异可总结为以下几点:

  1. 开发效率:MyBatis-Plus 通过封装通用操作显著减少模板代码。
  2. 功能扩展:MyBatis-Plus 提供逻辑删除、自动填充等企业级功能。
  3. 灵活性:MyBatis 在处理复杂 SQL 时更具优势。

选择建议

  • 新项目优先考虑 MyBatis-Plus,快速实现基础功能。
  • 复杂查询场景保留 MyBatis 的灵活性,两者可混合使用。

通过合理选择工具,可在保证代码质量的前提下,最大化提升开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿享天开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值