MyBatis(1)MyBatis优缺点

383 阅读3分钟

MyBatis 是一个半自动的持久层框架。它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

MyBatis 的优点:

  1. 易于上手和使用:MyBatis 的配置和使用相对简单直观,学习曲线平缓。
  2. 灵活性:通过 XML 或注解的方式,可以编写动态 SQL,这对于复杂或者不规则的 SQL 查询非常有用。
  3. 解耦合:MyBatis 良好地解耦了 SQL 语句和业务逻辑,使得 SQL 维护和业务代码维护相互独立。
  4. 性能:MyBatis 直接使用 JDBC 进行数据库操作,避免了其他全自动 ORM 框架的性能损耗。
  5. 集成:可以和多种数据库无缝集成,通过简单调整配置即可切换数据库。

MyBatis 的缺点:

  1. 半自动化:相比全自动化的 JPA 或 Hibernate 等 ORM 框架,MyBatis 需要手写 SQL 语句,工作量较大。
  2. 二级缓存:虽然 MyBatis 支持一级和二级缓存,但其二级缓存的设计没有像 Hibernate 那样成熟和使用广泛。
  3. 批量操作复杂:在执行批量操作时,MyBatis 需要开发者手动优化 SQL 语句和处理批量操作的事务。

源码解析与代码演示:

为了进行源码解析,我们需要了解 MyBatis 的核心组件和工作流程。核心组件包括 SqlSessionFactoryBuilderSqlSessionFactorySqlSessionMapper

  • SqlSessionFactoryBuilder:这个类用于解析配置文件,构建 SqlSessionFactory
  • SqlSessionFactory:它的作用是创建 SqlSession 的实例。
  • SqlSession:相当于 JDBC 中的 Connection,用于执行 SQL 语句并返回结果。
  • Mapper:由 MyBatis 动态代理生成,用于绑定指定的 SQL。

配置解析

// 用 SqlSessionFactoryBuilder 构建 SqlSessionFactory
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

在这一步中,XMLConfigBuilder 类将解析 MyBatis 配置文件并构建 Configuration 实例。

SqlSession 创建和使用

// 使用 SqlSessionFactory 创建 SqlSession
SqlSession session = sqlSessionFactory.openSession();
try {
    Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
    session.close();
}

SqlSession 提供了执行 SQL 命令的所有方法。你可以通过 SqlSession 直接运行已映射的 SQL 语句。

Mapper 接口

// 获取 Mapper 接口的代理对象
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

Mapper 接口是 MyBatis 的一个核心概念,它将一个 Java 接口和一个 XML 文件绑定,从而简化了对 SQL 操作的调用。在这个过程中,MyBatis 通过 MapperProxy 类使用动态代理技术来实现接口方法和 XML 中定义 SQL 语句的映射。

动态 SQL

在 MyBatis 的映射文件中,我们可以编写动态 SQL 来应对复杂的查询条件:

<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

在上面的 XML 片段中,我们使用了 <if> 标签来编写条件查询,只有在 title 不为 null 时,SQL 语句中会包含 title 相关的查询条件。

总结来说,MyBatis 提供了一个简洁的框架来处理数据库交互,但它需要开发者手动编写 SQL。虽然这增加了代码量,但也提供了更高的灵活性和控制,特别是在复杂查询和优化场景中。通过源码分析,我们可以看到 MyBatis 如何利用 Java 的高级特性如动态代理和反射来减少样板代码并简化数据库操作。