MyBatis 是一个半自动的 ORM(Object Relational Mapping)框架,它主要的核心组件包括:
-
SqlSessionFactoryBuilder:这个类可以根据配置文件或者配置实例来构建
SqlSessionFactory
。 -
SqlSessionFactory:一旦被创建,它应该在你的应用执行期间一直存在,没有理由丢弃它或者重新创建另一个实例。它的最佳范围是应用范围。最简单的就是使用单例模式或者更简单的,作为一个应用范围的属性。
-
SqlSession:每个线程都应该有它自己的
SqlSession
实例。SqlSession
的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。绝对不能将SqlSession
实例的引用放在一种类似于静态字段甚至是类实例字段的变量中。也绝不能将SqlSession
实例的引用放在任何类型的管理范围中,比如 Servlet 架构中的HttpSession
。 -
Executor:MyBatis 的执行器是一个很重要的概念,它是负责执行低级别的 SQL 操作的内部对象,是 MyBatis 的核心组件之一。
-
Mapper Interface:这些接口是由用户定义的,它们包含了方法,这些方法可以对数据库进行操作。MyBatis 会根据 XML 文件或注解自动生成 Mapper 接口的实现。
-
XML Mapper:这个文件包含了一系列的 SQL 映射语句,可以使用 XML 标签来书写动态 SQL。
-
Mapped Statements:在 MyBatis 中,每一个
<select>
,<insert>
,<update>
,<delete>
标签,以及对应的注解,都会被解析成一个 Mapped Statement 对象。 -
SqlSource:每个 Mapped Statement 都会有一个 SqlSource,它用来产生 BoundSql 对象,这个对象包含了最终要执行的 SQL 语句和相关的参数信息。
-
ResultMaps:这是一个描述如何从数据库结果集中来加载对象的映射器。
-
Type Handlers:在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,MyBatis 会使用类型处理器将获取的值转换为 Java 类型。
-
Cache:MyBatis 中的缓存,包括一级缓存(SqlSession 级别的缓存)和二级缓存(映射器级别的缓存)。
现在,让我们看一个基本的 MyBatis 设置代码示例。
// 1. SqlSessionFactoryBuilder
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 2. SqlSessionFactory
try (SqlSession session = sqlSessionFactory.openSession()) {
// 3. SqlSession
// 5. Mapper Interface
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
System.out.println(blog.getTitle());
// 4. Executor
// 此时,MyBatis 的内部 Executor 将负责执行 SQL 语句并返回结果。
} catch (IOException e) {
// Exception handling
}
这里,请注意:
- 配置文件
mybatis-config.xml
包含了 MyBatis 的配置信息。 - Mapper 接口
BlogMapper
会有一个相应的 XML 文件或者注解来定义 SQL 映射。 - 在调用
mapper.selectBlog(101)
方法时,MyBatis 会转换这个调用为相应的 SQL 语句执行。
MyBatis 的实现细节和优化技术主要植根于它的动态 SQL 解析,参数映射,结果映射,缓存策略等方面。通过对这些关键组件的深入理解,开发者可以更高效地使用 MyBatis,并且在必要时可以对其进行扩展。