mybatis的运行原理

1.SqlSessionFactory的创建

1.1.获取配置文件流,通过SqlSessionFactoryBuilder的build方法返回一个SqlSessionFactory
1.2.build会创建一个XPathParser解析器去解析配置文件
1.3.XPathParser解析器将解析的内容设置到Configuration对象中
1.4.接着创建一个mapper的解析器去解析mapper.xml文件,解析的内容同样保存在Configuration
1.5.针对<select><update><delete><insert>等标签,会创建一个statment的解析器去解析增删改查标签内容,将解析的内容分别封装到标签对应的MappedStatement(一个MappedStatement代表一个增删改查的标签)
1.6.所有配置文件解析完,返回一个configuration对象,该对象保存了配置文件和mapper.xml文件的所有信息(每一个接口对应一个MappedProxy,我们拿到的都是接口的代理对象;接口的每一个方法对应一个MappedStatement)
1.7.用Configuration对象build一个DefaultSqlSessionFactory(这是SqlSessionFactory接口的实现类,里面保存了拥有全部配置文件的信息的configuration对象)
总结:解析所有配置文件并将解析的信息保存到Configuration,最后返回一个包含全部配置信息Configuration的SqlsessionFactory接口的实现类DefaultSqlSessionFactory

2.获取SqlSession对象

2.1.调用SqlSessionFactory的openSession()方法
2.2.openSession()方法中实际调用了openSessionFromDatasource()方法,从数据源获取Session对象
2.3.从Configuration 对象获取环境变量等信息,然后创建一个执行器Executor,然后在拦截器中对Executor进行包装
2.4.创建并返回DefaultSqlSession(SqlSession接口的实现类),包含Configuration、Executor

3.获取mapper接口的实现类

3.1.调用getMapper()方法通过接口类型创建接口的代理对象MapperProxy,包含SqlSession对象

4.执行增删改查方法

4.1.MapperProxy调用invoke()方法,在invoke()方法中会判断要执行的方法是Object还是接口的,如果是Object则直接执行,属于接口的方法,然后调用方法的execute方法,需要传入sqlsession和参数
4.2.判断增删改查类型,包装参数成map对象或者直接返回(参数个数大于1,包装常map对象)
4.3.然后根据参数的和方法名调用SqlSession的增删改查方法,SqlSession最终调用Exe
cutor的增删改查方法
4.4.Executor会创建StatementHandler来处理sql语句的预编译以及设置参数等工作
4.3.创建StatementHandler的时候同时创建ParameterHandler来对sql语句进行预编译、设置参数,创建ResultSetHandler来处理结果集
4.4.ParamterHandler和ResultSetHandler都借助TypeHandler进行数据库表和javaBean的映射

mybatis运行原理总结:

1.解析全部配置文件(全局配置文件、mapper映射文件),将解析的内容封装到Configuration对象中

2.利用Configuration创建DefaultSqlSessionFactory对象

3.利用DefaultSqlSessionFactory创建DefaultSqlSession(包含Configuration、Executor)

4.获取接口的代理对象,DefaultSqlSession调用getMapper(),返回mapper接口对应的MapperProxy(包含DefaultSqlSession)

5.MapperProxy代理对象执行增删改查方法

  5.1.DefaultSqlSession调用增删改查方法,实际上是Executor调用增删改查方法
  5.2.创建StatementHandler、ParameterHandler、ResultSetHandler
  5.3.StatementHandler通过ParameterHandler处理sql预编译以及设置参数
  5.4.调用StatementHandler的增删改查方法
  5.5.通过ResultSetHandler处理结果集

注意:四大对象Executor、StatementHandler、ParameterHandler、ResultSetHandler创建时都调用interceptorChain.pluginAll(),这个方法实际就是插件的操作,自定义插件就需要实现interceptor接口并实现intercept()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值