Mybatis架构解析(源码)最重要!!!!
架构:Mybatis
数据处理层:
架支撑层:confg
引导层:
源码底层了解:
查学生:
这些都是做准备的:为查询 xml 为resource resource为 reader reader为sessionFactory做准备。
重点:::::mybatis 执行步骤:
a. 获得 sqlsessionFactory 对象。new SQLSessionFactory()build(reader);
源码分析:
获取到一个parser解析器
通过一个解析器返回对象。
进一下parser 方法。parserConfiguration 方法。
进入parseConfiguration 方法里面。
记下来 : 通过parseConfiguration ()这个方法 在configuration标签设置了properties settiing environment 等属性。
有很多设置方式;settingElement: sql执行器默认是simple类型。
将所有的配置信息放在了configuration 对象中。
解析所有的Xxxxmapper.xml文件(分析里面的增删改查标签)
mapperElement ,settingElement…
解析mapper 然后将mapper里面的东西放入到configurationElement里面了
parse ------》configuration-(可以处理setting和mapper等)-----》
增删改查标签里面你可以设置 数据库环境。
增删改查可以通过这个方法解析的
confg 里面的属性在configuratio里面。
返回configuration对象。这个对象返回什么东西:每一个mapperedstatement 就是一个标签。
b. 获取SQLSession对象。
源码分析:
a(b(c()))先进C 然后找不到进B 然后找不到进A.枚举类型 。
还是在Configuration 拿到了具体的执行器。
configuration.newExecutor(tx,execType)---->SimpleExecutor.
根据不同类型execType 产生不同的执行器 Executor. ,并且会对执行器进行拦截操作:
executor = (Executor) interceptorChain.pluginAll(executor);
装饰模式,包装模式 变成的强大了。
通过装饰模式将刚才产生的执行器包装成更加强大的 执行器(executor)
作用:以后要Mybatis写自己的插件,就可以通过拦截器实现。把自己的功能加入到拦截器里面。插件开发 : 1 写插件 2 放入拦截器。
自动把自己写的拦截器作用到Executor里面。
哪一种执行器。
返回DefaultSqlSession(configuration,exeCutor,事务);-----》
一切信息在configuration(配置信息,增删改查标签)里面。又加了执行器(exeCutor),用执行器来执行配置内容(configuration)
这一个调用openSession.
------------------>>>>>>>>>>
---------------->>>>>>>.opensession 调用openSessionFormDataSource.
defaultSqlSession 对象里面包括了configuration配置文件 executor执行器 事务所以可以执行了。
流程::::::
confg mapper 存在了 configuration对象里面。然后configuration存放在SQLSessionFactory , SQLSessionFactory 默认是DefaultSQLSessionFactory对象。
SQLSession默认是defaultsqlsession.执行增删改查 是执行器执行。
执行增删改查 标签。增删改查底层是mappendstatement 对象。
执行从数据库执行。
c.通过session 获得xxxmapper 的接口代理对象(代理接口中的方法,mapper.xml 中的《select》等标签) 通过代理对象执行 CRUD 源码分析
当我们进入queryStudentByNo 方法本身 执行的不是方法而是进去代理对象的方法。
获取Xxxxmapper 对象,执行
执行增删改查–>MapperProxy/invoke()---->invocationHandler:JDK动态代理接口。有且仅有一个invoke方法。 用到了动态代理模式;增删改查 - 》代理对象(mapperProxy 对象) - --> 代理对象 帮我们““代理执行””增删改查方法
(中介帮你找房子 代理对象)—》
XXxmapper 代理对象:
执行增删改查时:-----》invoke
cacheMethod 缓存方法。先查看缓存里面有没有 空缓存去库里面 找完在放进库里面 。
SQLSession的对象是defaultSQLSession的对象。执行时通过executor执行。
mapperMethod.execute(sqlSession.args):实际调用增删改查的方法,依靠了SQLSession中的configuration 和executor。。。。。。
commend gettype 是类型 case 里面进行查询 convertArgsparams
处理增删改查方法的参数 :method.convertArgsCommandparam(args):如果参数是一个return null 如果一个返回一个 如果多个放入map里面。

增删改查时需要 处理参数 处理参数就是param 参数处理完了处理结果集。





xxxmapper 执行方法在interface里面。
同时查询会出现高并发问题 和线程问题
d. 执行标签中定义的sql语句。增删改查方法。