Mybtis和Mybatis-Plus区别

发布于:2025-04-18 ⋅ 阅读:(66) ⋅ 点赞:(0)

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架,MyBatis-Plus 是在 MyBatis 基础上增强的工具包,让开发更便捷、高效。下面是两者主要的区别:


✅ 核心区别总结:

特性 MyBatis MyBatis-Plus
配置复杂度 需要手写大量 XML 或注解 极简配置,自动生成 SQL
CRUD 操作 手写 Mapper 方法 + SQL 内置通用 CRUD 方法
分页功能 需要手写分页逻辑或第三方插件 内置分页插件,开箱即用
条件构造器 无,需要手写 where 条件 内置 Lambda 条件构造器
代码生成 提供代码生成器(Code Generator)
主键策略 需要手动配置 内置多种主键生成策略
乐观锁 自己实现 提供内置乐观锁插件
审计字段(如创建时间、修改时间) 自行维护 提供自动填充功能
性能分析 需要额外工具 内置 SQL 性能分析插件
兼容性 灵活、手动控制高 完全兼容 MyBatis,可随时退回

🧩 1. 配置复杂度

✅ MyBatis:
  • 需要创建 Mapper 接口 + Mapper.xml 文件

  • SQL 都需要手动写,配置较繁琐

  • 实体类、字段和表结构需要手动映射(resultMap 或 @Results)

<!-- MyBatis 的 select 示例 -->
<select id="selectById" resultType="User">
  SELECT * FROM user WHERE id = #{id}
</select>
✅ MyBatis-Plus:
  • 只需配置数据库连接、扫描 Mapper 包

  • 不需要写 XML,自动完成 SQL 拼接

  • 实体类字段与表字段名称一致可自动映射

// 简洁调用
User user = userMapper.selectById(1L);

🧩 2. CRUD 操作

✅ MyBatis:
  • 所有 CRUD 方法都需要手写

  • 如果实体类字段多,SQL 写起来冗长,易出错

✅ MyBatis-Plus:
  • 提供 BaseMapper<T>,自动拥有 20+ 个通用 CRUD 方法

  • 例如:

    • selectById, insert, updateById, deleteById

    • 批量插入、分页查询、条件查询等也支持

userMapper.insert(user); // 自动生成 insert SQL

🧩 3. 分页功能

✅ MyBatis:
  • 需要自己拼接分页 SQL(LIMIT/OFFSET)

  • 或接入第三方分页插件如 PageHelper

✅ MyBatis-Plus:
  • 提供 分页插件,配置一次后,使用非常方便

  • 统一使用 Page<T> 对象传参

Page<User> page = new Page<>(1, 10); // 页码1,每页10条
Page<User> result = userMapper.selectPage(page, null);

🧩 4. 条件构造器

✅ MyBatis:
  • 条件查询时需要手写 SQL 中的 where 子句
✅ MyBatis-Plus:
  • 提供 QueryWrapperLambdaQueryWrapper

  • 可链式编程、支持条件组合、动态拼接

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20).like(User::getName, "张");
List<User> users = userMapper.selectList(wrapper);

🧩 5. 代码生成

✅ MyBatis:
  • 没有自带代码生成工具,通常需要借助 MyBatis Generator 插件,且配置复杂
✅ MyBatis-Plus:
  • 自带 Code Generator,支持通过数据库自动生成:

    • 实体类、Mapper 接口、XML、Service、Controller 等
// 快速生成一整套文件,只需配置数据库和模板路径
AutoGenerator generator = new AutoGenerator();
// 配置略...
generator.execute();

🧩 6. 主键策略

✅ MyBatis:
  • 插入数据时需要手动指定主键或配置主键返回策略(如 useGeneratedKeys)
✅ MyBatis-Plus:
  • 支持多种主键生成方式:

    • 自增、UUID、雪花算法(默认使用雪花)
  • 只需在实体类中加注解即可

@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成主键
private Long id;

🧩 7. 乐观锁

✅ MyBatis:
  • 需要手动实现版本字段逻辑和 SQL 拼接
✅ MyBatis-Plus:
  • 提供内置插件支持乐观锁,自动对 version 字段进行比较和更新
@Version
private Integer version; // 更新时会自动加入 version=... 的判断

🧩 8. 审计字段(创建时间、修改时间)

✅ MyBatis:
  • 需要手动在 insert/update 语句中维护 createTime, updateTime
✅ MyBatis-Plus:
  • 提供自动填充功能,支持插入/更新时自动填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
  • 需要配置 MetaObjectHandler,一次性设置全局规则

🧩 9. 性能分析

✅ MyBatis:
  • 需要自己接入日志框架或 SQL 监控工具(如 P6Spy)
✅ MyBatis-Plus:
  • 内置 SQL 执行分析插件(dev/test 环境下很实用)
// 开启性能分析插件
interceptor.addInnerInterceptor(new PerformanceInterceptor());

🧩 10. 兼容性

✅ MyBatis:
  • 灵活度高,自由度大,但需要手动控制 SQL
✅ MyBatis-Plus:
  • 100% 兼容原生 MyBatis

  • 可以只使用通用功能,特殊需求时照样写 XML、注解 SQL


🚀 使用场景建议:

  • MyBatis:适合 SQL 极度复杂、强定制化的项目,想完全控制 SQL。

  • MyBatis-Plus:适合大多数通用业务,追求开发效率、简洁的项目,尤其适合中后台管理系统。


网站公告

今日签到

点亮在社区的每一天
去签到