MyBatis觉得在哪方面做的比较好?
MyBatis 在 SQL 灵活性、动态 SQL 支持、结果集映射 和 与 Spring 整合 方面表现卓越,尤其适合重视 SQL 可控性的项目。
✅ 优势详解:
-
SQL 与代码解耦,灵活可控:
MyBatis 允许开发者直接编写和优化 SQL,相比全自动 ORM(如 Hibernate),MyBatis 让开发者明确知道每条 SQL 的执行逻辑,便于性能调优。
<!-- 示例:XML 中定义 SQL -->
<select id="findUserWithRole" resultMap="userRoleMap">
SELECT u.*, r.role_name
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
WHERE u.id = #{userId}
</select>
-
动态 SQL 的强大支持:
可以动态拼接 SQL,通过 、、 等标签动态生成 SQL,避免 Java 代码中繁琐的字符串拼接。
<select id="searchUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name LIKE #{name}</if>
<if test="status != null">AND status = #{status}</if>
</where>
</select>
-
自动映射与自定义映射结合:
自动将查询结果字段名与对象属性名匹配(如驼峰转换)。
<resultMap id="userRoleMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<collection property="roles" ofType="Role">
<result property="roleName" column="role_name"/>
</collection>
</resultMap>
插件扩展机制
- 支持自定义插件拦截 SQL 执行过程,可实现 分页、性能监控、SQL 改写 等。
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {...})
})
public class PaginationPlugin implements Interceptor {
// 实现分页逻辑
}
与 Spring 无缝集成
- 使用 @MapperScan 自动扫描 Mapper 接口,结合 Spring 管理事务,配置简单高效。
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
// 数据源和 SqlSessionFactory 配置
}
MyBatis Plus 和 MyBatis 的区别?
MyBatis Plus 是一个基于 MyBatis 的增强工具库,旨在简化开发并提高效率。以下是 MyBatis Plus 和 MyBatis 之间的一些主要区别:
✅ 核心差异点
-
CRUD 操作:
MyBatis Plus 通过继承 BaseMapper 接口,提供了一系列内置的快捷方法,使得 CRUD 操作更加简单,无需编写重复的 SQL 语句。
-
代码生成器:
MyBatis Plus 提供了代码生成器功能,可以根据数据库表结构自动生成实体类、Mapper 接口以及 XML 映射文件,减少了手动编写的工作量。
-
通用方法封装:
MyBatis Plus 封装了许多常用的方法,如条件构造器、排序、分页查询等,简化了开发过程,提高了开发效率。
-
分页插件:
MyBatis Plus 内置了分页插件,支持各种数据库的分页查询,开发者可以轻松实现分页功能;而在传统的 MyBatis 中,开发者需要自己手动实现分页逻辑。
-
多租户支持:
MyBatis Plus 提供了多租户的支持,可以轻松实现多用户数据隔离的功能。
-
注解支持:
MyBatis Plus 引入了更多的注解支持,使得开发者可以通过注解来配置实体与数据库表之间的映射关系,减少了 XML 配置文件的编写。