目录
介绍
用来操作数据库的持久层框架, 通过xml和简单注解来执行数据库的增删改查操作
架构
接口层-与数据库操作方式
-
使用传统的MyBatis提供的API
通过操控sqlSession对象, 根据传入的statement id 和 查询参数 来对数据库进行增删改查的操作, 这种方式不符合面向接口编程习惯 -
使用Mapper接口
将xml中<mapper>抽象为java 接口中的方法, <mapper>节点的CRUD对应着操作数据库不同操作
xml mapper文件里的id值 等于 java 接口中的方法名
parameterType 值表示Mapper 对应方法的入参类型,而resultMap 值则对应了Mapper 接口表示的返回值类型
配置好后, sqlSession 根据接口声明的方法信息, 通过动态代理机制生成一个mapper实例, 当用mapper接口某个方法时, mybatis根据方法名和参数类型, 确定statement id, 然后将此id和参数传到sqlSession中执行操作数据库的操作, 这样满足了面相接口编程需要
数据处理层
两大功能
- 根据参数构建动态SQL语句
- SQL语句执行及封装查询结果
参数映射
java数据类型和jdbc数据类型转换, 拥有两个过程
- 将java类型数据转换成jdbc类型数据, 通过 .setXXX()方法来设置
- 对查询结果的jdbc转换成java数据类型
框架支撑层
- 事务管理机制
- 连接池管理机制
- 缓存机制
会将某次查询放置到SqlSession中 - SQL语句配置方式
注解配置接口,但高级功能依赖于XML
引导层
引导Mybatis两种方式
- 基于xml配置文件
- 基于java api方式
主要构件和相互关系
- SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
- Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
- StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
- ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,
- ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
- TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
- MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装,
- SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
- BoundSql 表示动态生成的SQL语句以及相应的参数信息
- Configuration MyBatis所有的配置信息都维持在Configuration对象之中。
Mybatis详解
初始化方式
两种
- 基于XML配置文件:基于XML配置文件的方式是将MyBatis的所有配置信息放在XML文件中,MyBatis通过加载并XML配置文件,将配置文信息组装成内部的Configuration对象。
- 基于Java API:这种方式不使用XML配置文件,需要MyBatis使用者在Java代码中,手动创建Configuration对象,然后将配置参数set 进入Configuration对象中。
创建sqlSession过程
// mybatis初始化
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行SQL语句
List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
SqlSessionFactoryBuilder相关的代码如下所示:
public SqlSessionFactory build(InputStream inputStream) {
return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
//2. 创建XMLConfigBuilder对象用来解析XML配置文件,生成Configuration对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//3. 将XML配置文件内的信息解析成Java对象Configuration对象
Configuration config = parser.parse();
//4. 根据Configuration对象创建出SqlSessionFactory对象
return build(config);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.