一、组件
1、SqlSessionFactoryBuilder: 根据配置信息或者代码生成 SqlSessionFactory;
2、SqlSessionFactory: 生成 sqlSession 会话,单例模式;
3、SqlSession: 既可以发送sql去执行并返回结果,也可以获取Mapper的接口;
是一个接口类:相当于JDBC一个connection对象,每次执行sql,都会新建一个SqlSession对应的实例,一个sqlSession(实现类)对应一个数据库连接,执行完sql,释放sqlSession;
实现:
(1)DefaultSqlSession:
(2)SqlSessionManger:
用途:
(1)获取映射器:让映射器通过命名空间和方法名称找到对应的sql,发送给数据库执行后返回结果;
(2)直接通过命名空间信息去执行sql返回结果,只是iBatis版本留下的方式。
4、SQL Mapper:他是由一个Java 接口和XML 文件(或注解)构成,只需要给出SQL和映射规则,它负责发送SQL 去执行,并返回结果;
是一个接口,没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此他应该在一个sqlSession事务方法内,是一个方法级别的东西,他就如同JDBC 中一条SQL语句的执行,它最大范围和sqlSession是相同的,所以在一个sqlSession方法中使用完之后,然后废弃掉。
二、Mybatis 的解析和运行原理
1、设计的技术难点:
(1)反射技术
(2)动态代理:
JDK 动态代理(依赖接口): Mapper 中用到;
CGLIB(弥补JDK缺陷):延迟加载的时候用到;
2、构建SqlSessionFactory
(1)构建Configuration
1)读入配置文件;
2)初始化基础配置;
3)提供单例;
4)执行一些重要的对象方法;
(2)映射器的内部组成
1)MappedStatement:
2)SqlSource:它是提供BoundSql的地方;
3) BoundSql: 建立sql和参数的地方;三个属性:SQL、parameterObject、ParameterMappings
(3)sqlSession运行过程
1)映射器的动态代理
2)sqlSession下的四大对象
① Executor:调度下面这三种对象的执行;
三种:
SIMPLE:简易执行器;
REUSE:重用预处理语句;
BATCH:针对批量专用的执行器;
② StatementHandler:数据库会话器,处理数据库会话;
分三种:
SimpleStatementHandler:
PrepareStatementHandler:
CallableStatementHandler:
SQL 执行过程:Executor 会先调用 StatementHandler的prepare() 方法预编译SQL语句(防止sql注入),同事设置一些基本运行的参数,然后用parameterize() 方法启用ParameterHandler 设置参数,完成预编译,跟着就是执行sql,最后如果需要查询就用ResultSetHandler封装结果返回给调用者;
③ ParameterHandler:参数处理器;
④ ResultHandler:结果处理器