使用mybatis的好处
-
只需要写好sql语句,无需关心一下点
-
数据库连接,资源释放问题
-
参数处理问题
-
结果集处理问题
-
-
sql语句可以同一管理
-
提高sql语句的复用性
mybatis的主要工作流程
-
在容器启动的时候通过
SqlSessionFactoryBean
创建SqlSessionFactoryBuilder
对象 -
SqlSessionFactoryBuilder
:-
将mybatis配置信息,数据库等信息,交给
XmlConfigBuilder
对象生成Configuration
对象。 -
根据
Configuation
对象创建DefaultSqlSessionFactory
对象
-
-
SqlSessionFactory
: 主要是打开SqlSession
对象,获取创建Environment,Executor
对象创建DefaultSqlSession
对象 -
DefaultSqlSession
: 该类中定义了很多数据库的操作(增删查改,提交,回滚等),负责与数据库的交互-
通过
Configuration
对象解析sql语句信息生成MappedStatement
对象,该对象主要是保存sql语句信息 -
将真正的对数据的操作交给
Executor
对象
-
-
Executor
-
获取数据库的连接
-
创建
statementHandler
对象
-
-
StatementHandler
对象获得数据库的Statement
对象,由statement对象执行sql语句,并将结果交给ResultSetHandler
对象处理结果集,然后依次返回结果 -
mybatis中的事务
-
mybatis,spring框架中事务的实现方式
-
声明式事务:基于注解和配置文件,面向切面的方式实现(aop)
-
编程式事务:写代码在代码中处理事务
-
-
事务的实现步骤 (DataSourceTransactionManager)
-
获取事务 (doGetTransaction)
-
开始事务(doBegin) : 在设置了事务的方法的开始根据设置开启一个事务,关闭自动提交(在无事务的情况下,事务是自动提交的)
-
执行sql
-
提交事务(doCommit),或者在遇到异常的情况下回滚事务(rallBack)
-
mybatis插件(plugin)
-
概述:mybatis提供插件的功能,虽然叫做插件,其实是拦截器的功能(Interceptor)。
-
作用: 通过拦截器(Interceptor)对处理类(configuration 中规定只能对如下四种处理类进行拦截Executor,ParameterHandler,ResultHandler,StatementHandler),根据需求做特殊处理(改变mybatis提供的处理),期间插件(Plugin)会根据是否有拦截器来返回原对象或者代理类,由代理类判断是否需要执行过滤方法
-
相关接口、类、注解
-
Interceptor : intercept(拦截方法)、plugin(返回代理对象或者原对象的方法)、setProperties(获取配置文件的属性参数)
-
Plugin :warp
-
@Intercepts({@Signature( type = Executor.class, method = "update", args = {MappedStatement.class, Object.class} ), @Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} )}) 以上注解指定了 该拦截器对哪个处理类(Executor)的哪个方法(update(MappedStatement arg1,Object arg2)、 query(MappedStatement arg1,RowBounds arg2,ResultHandler arg3))进行拦截
-
插件处理过程
-
项目初始化的时候,创建配置的拦截器(Interceptor)
-
初始化SqlSessionFactoryBean时将插件信息(plugin)添加到Configuation中
-
Configuration 对象会把拦截器(Interceptor)加入拦截器链
-
-
在Configuration创建处理器时,会将处理器交给拦截链(InterceptorChain),拦截链是一个存放拦截器的List ,所以最后还是会将处理器交给拦截器(Interceptor)的plugin()方法来根据拦截链中是否存在拦截器来判断是返回原处理器(无),还是返回代理处理器对象(有)。
-
在调用执行被处理器过滤的方法(query、update等)的时候,如果上一步返回了代理处理器类,则会先调用拦截器的拦截方法(intercept)。