MyBatis 与 MyBatis-Plus 的区别
在 Java 持久层框架中,MyBatis 和 MyBatis-Plus 是两款广泛使用的工具,它们既有紧密的联系,又存在显著差异。下面从核心特性、使用方式等方面详细对比两者的区别。
1. 核心定位不同
-
MyBatis:
是一款轻量级的持久层框架,它的核心思想是通过 XML 或注解方式将 SQL 语句与 Java 方法绑定,让开发者可以灵活控制 SQL 编写,避免了 JDBC 繁琐的代码编写。但 MyBatis 只提供基础的 CRUD 支持,很多通用操作需要开发者手动编写 SQL。 -
MyBatis-Plus:
是在 MyBatis 基础上开发的增强工具,遵循“只做增强,不做改变”的原则。它在保留 MyBatis 原有功能的同时,增加了大量实用特性,旨在简化开发,减少重复的 SQL 编写工作。
2. 通用 CRUD 操作支持
-
MyBatis:
对于基本的增删改查(CRUD)操作,需要开发者手动编写 SQL 语句(无论是在 XML 中还是通过注解)。例如,查询单条数据需要编写:<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id} </select>
-
MyBatis-Plus:
提供了 BaseMapper 接口,该接口中封装了大量通用的 CRUD 方法,开发者只需让自己的 Mapper 接口继承 BaseMapper,即可直接调用这些方法,无需编写 SQL。例如:public interface UserMapper extends BaseMapper<User> {// 无需编写代码,直接使用 selectById、insert、update 等方法 } // 调用示例 User user = userMapper.selectById(1);
3. 条件构造器的差异
-
MyBatis:
当需要动态拼接 SQL 条件(如多条件查询)时,需使用<if>
<where>
等标签在 XML 中手动拼接,例如:<select id="selectByCondition" resultType="User">SELECT * FROM user<where><if test="name != null">AND name LIKE #{name}</if><if test="age != null">AND age > #{age}</if></where> </select>
-
MyBatis-Plus:
提供了 Wrapper 条件构造器,可以通过 Java 代码动态构建查询条件,无需编写 XML。例如:QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", "张").gt("age", 18); List<User> userList = userMapper.selectList(queryWrapper);
这种方式更直观,且避免了 XML 中繁琐的标签拼接。
4. 其他增强功能
MyBatis-Plus 在 MyBatis 基础上增加了诸多实用功能,而这些是 MyBatis 不具备的:
- 代码生成器:可以根据数据库表结构自动生成实体类、Mapper 接口、Service 等代码,大幅减少重复劳动。
- 分页插件:内置分页功能,只需简单配置即可实现分页查询,无需手动编写分页 SQL。
- 逻辑删除:通过注解即可实现逻辑删除(更新删除标识字段),无需手动编写更新语句。
- 字段自动填充:支持对创建时间、修改时间等字段进行自动填充,无需在代码中手动设置。
底层关系与适用场景
- MyBatis-Plus 是 基于 MyBatis 实现 的,完全兼容 MyBatis 的所有功能,两者可以无缝切换。
- 若项目需要高度自定义 SQL,且不需要太多通用功能,MyBatis 足够轻量灵活。
- 若项目存在大量重复的 CRUD 操作,或需要快速开发以提升效率,MyBatis-Plus 是更好的选择,它能显著减少代码量,降低开发成本。
总之,MyBatis-Plus 是 MyBatis 的“增强版”,在保留灵活性的同时,为开发者提供了更多便捷工具,尤其适合快速开发场景。