MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上做了扩展和封装,让开发更高效。以下是核心区别:
核心定位
表格
| MyBatis | MyBatis-Plus | |
|---|---|---|
| 定位 | 持久层框架 | MyBatis 的增强插件/工具 |
| 关系 | 基础框架 | 基于 MyBatis,不能独立使用 |
| 开发方式 | 需手写大量 SQL/XML | 提供通用 CRUD,减少手写 SQL |
主要功能对比
表格
| 功能 | MyBatis | MyBatis-Plus |
|---|---|---|
| 基础 CRUD | 需手写 insert/update/delete/select |
内置通用方法,直接调用,零 SQL |
| 条件构造器 | 无 | QueryWrapper / LambdaQueryWrapper 动态拼 SQL |
| 分页插件 | 需自行实现或使用 PageHelper | 内置分页插件,一行代码搞定 |
| 代码生成器 | 无 | 自动生成 Entity、Mapper、Service、Controller |
| 主键策略 | 需配置或手写 | 内置雪花算法、自增等多种主键生成策略 |
| 逻辑删除 | 需自行实现 | 注解 @TableLogic 自动支持 |
| 自动填充 | 无 | @TableField(fill = ...) 自动填充创建/更新时间 |
| 多租户/SQL 注入 | 需自行实现 | 内置插件支持 |
| 性能分析 | 无 | 内置 SQL 执行性能分析插件 |
代码对比示例
MyBatis 写法
java
复制
// 需手写 XML 或注解 SQL
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(User user);
MyBatis-Plus 写法
java
复制
// 继承 BaseMapper,自带全套 CRUD,无需写任何 SQL
public interface UserMapper extends BaseMapper<User> {}
// 直接使用
userMapper.selectById(1L); // 根据 ID 查
userMapper.insert(user); // 插入
userMapper.updateById(user); // 根据 ID 更新
userMapper.deleteById(1L); // 根据 ID 删除
MyBatis-Plus 条件构造器(动态 SQL)
java
复制
// 复杂查询无需手写 SQL
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 18)
.like(User::getName, "张")
.orderByDesc(User::getCreateTime);
List<User> list = userMapper.selectList(wrapper);
// 自动生成: SELECT * FROM user WHERE age = 18 AND name LIKE '%张%' ORDER BY create_time DESC
如何选择?
表格
| 场景 | 建议 |
|---|---|
| 简单 CRUD 多、追求开发效率 | MyBatis-Plus(推荐) |
| 复杂 SQL 多、需要精细控制 | MyBatis 原生 + Plus 混合使用 |
| 老项目维护、已有大量手写 SQL | 保持 MyBatis 原生 |
| 新项目、Spring Boot 项目 | 直接用 MyBatis-Plus Starter |
一句话总结
MyBatis 是"给你工具,你自己造";MyBatis-Plus 是"常用功能已经造好了,你直接用"。
两者可以完全共存------简单操作用 Plus 的通用方法,复杂业务写原生 MyBatis SQL,互不冲突。