MyBatis 简介
MyBatis 的前身叫iBatis,本是apache的一个开源项目, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
Mybatis 的功能架构分为三层(图片借用了百度百科):
1) API 接口层:提供给外部使用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2) 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
快速入门
Mybatis 的整体流程图
SqlSessionFactoryBuilder
每一个 MyBatis 的应用程序的入口是 SqlSessionFactoryBuilder,它的作用是通过 XML 配置文件创建 Configuration 对象(当然也可以在程序中自行创建),然后通过 build 方法创建 SqlSessionFactory 对象。没有必要每次访问 Mybatis 就创建一次 SqlSessionFactoryBuilder,通常的做法是创建一个全局的对象就可以了。示例程序如下:
- private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
- private static SqlSessionFactory sqlSessionFactory;
- private static void init() throws IOException {
- String resource = "mybatis-config.xml";
- Reader reader = Resources.getResourceAsReader(resource);
- sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
- }
SqlSessionFactory
SqlSessionFactory 对象由 SqlSessionFactoryBuilder 创建。它的主要功能是创建 SqlSession 对象,和 SqlSessionFactoryBuilder 对象一样,没有必要每次访问 Mybatis 就创建一次 SqlSessionFactory,通常的做法是创建一个全局的对象就可以了。SqlSessionFactory 对象一个必要的属性是 Configuration 对象, 它是保存 Mybatis 全局配置的一个配置对象,通常由 SqlSessionFactoryBuilder 从 XML 配置文件创建。这里给出一个简单的示例:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration PUBLIC
- "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 配置别名 -->
- <typeAliases>
- <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
- <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
- </typeAliases>
- <!-- 配置环境变量 -->
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property name="driver" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
- <property name="username" value="iMybatis" />
- <property name="password" value="iMybatis" />
- </dataSource>
- </environment>
- </environments>
- <!-- 配置 mappers -->
- <mappers>
- <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
- </mappers>
- </configuration>
要注意 XML 头部的声明,需要用来验证 XML 文档正确性。typeAliases 元素是包含所有 typeAlias(别名)的列表,别名用来替换完整类名,这样在需要完整类名的地方就可以用别名来代替。environment 元素体中包含对事务管理和连接池的环境配置。mappers 元素是包含所有 mapper(映射器)的列表,这些 mapper 的 XML 文件包含 SQL 代码和映射定义信息。当然,在 XML 配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分,其他配置请参考 Mybatis 的官方文档。
SqlSession
SqlSession 对象的主要功能是完成一次数据库的访问和结果的映射,它类似于数据库的 session 概念,由于不是线程安全的,所以 SqlSession 对象的作用域需限制方法内。SqlSession 的默认实现类是 DefaultSqlSession,它有两个必须配置的属性:Configuration 和 Executor。Configuration 前文已经描述这里不再多说。SqlSession 对数据库的操作都是通过 Executor 来完成的,Executor 的具体功能在下一小节在描述。
到目前为止,我们看到的都是 mybatis 的流程,我们的应用程序在什么地方插入到这个流程中并获得我们想要的结果呢?就是 SqlSession 这里。SqlSession 有一个重要的方法 getMapper,顾名思义,这个方式是用来获取 Mapper 对象的。什么是 Mapper 对象?根据 Mybatis 的官方手册,应用程序除了要初始并启动 Mybatis 之外,还需要定义一些接口,接口里定义访问数据库的方法,存放接口的包路径下需要放置同名的 XML 配置文件。SqlSession 的 getMapper 方法是联系应用程序和 Mybatis 纽带,应用程序访问 getMapper 时,Mybatis 会根据传入的接口类型和对应的 XML 配置文件生成一个代理对象,这个代理对象就叫 Mapper 对象。应用程序获得 Mapper 对象后,就应该通过这个 Mapper 对象来访问 Mybatis 的 SqlSession 对象,这样就达到里插入到 Mybatis 流程的目的。示例代码如下:
- SqlSession session= sqlSessionFactory.openSession();
- UserDao userDao = session.getMapper(UserDao.class);
- UserDto user = new UserDto();
- user.setUsername("iMybatis");
- List<UserDto> users = userDao.queryUsers(user);
对应的接口:
- public interface UserDao {
- public List<UserDto> queryUsers(UserDto user) throws Exception;
- }
对应的配置文件:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="org.iMybatis.abc.dao.UserDao">
- <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
- useCache="false">
- <![CDATA[
- select * from t_user t where t.username = #{username}
- ]]>
- </select>
- </mapper>
Executor
Executor 对象在创建 Configuration 对象的时候创建,并且缓存在 Configuration 对象里。Executor 对象的主要功能是调用 StatementHandler 访问数据库,并将查询结果存入缓存中(如果配置了缓存的话)。
StatementHandler
StatementHandler 是真正访问数据库的地方,并调用 ResultSetHandler 处理查询结果。
ResultSetHandler
处理查询结果。