当前位置:首页 > 旅游指南

parameterize Mybatis的SqlSession运行原理

(1)介绍了(1)SqlSession的简单原理

SqlSession提供选择/插入/更新/删除方法。在旧版本中,这些方法使用了SqlSession接口,但是在Mybatis的新版本中,建议使用Mapper接口。

Mapper实际上是一个动态的代理对象,只需输入MapperMethod的执行方法,就可以简单的找到SqlSession的删除、更新、查询和选择方法。从底层实现来看:使用动态代理技术,让接口运行,然后采用命令模式,最后使用SqlSession的接口方法(getmapper()方法,等待Mapper)执行SQL查询(也就是说Mapper接口方法的底层还是用SqlSession接口方法实现)

注意:虽然以上只是简单的描述,但实际上源代码比较复杂。以下将以源代码为基础简单介绍一下!

(2)二进制会话的四个重要对象

1)执行:调度StatementHandler、ParmmeterHandler、ResultHandler执行相应的SQL语句;

2)statementandler:使用数据库中的语句(prepareStatement)来执行操作,即底层是封装的prepare Statement;

3)parameterthandler:处理SQL参数;

4)ResultHandler:对结果集进行打包处理并返回。

执行者起着至关重要的作用。它是真正执行Java与数据库交互的东西,参与整个SQL查询执行过程。

1)执行机构主要有三种:SIMPLE执行机构(未配置为默认执行机构)、REUSE为可重复使用的预处理语句、batch批量更新、BATCH专用处理器

2) Executor函数:Executor首先会调用StatementHandler的prepare()方法预编译SQL语句并设置一些基本的运行参数,然后调用StatementHandler的parameterize()方法(其实是启用ParameterHandler来设置参数)来设置参数。结果处理程序重组查询结果,并将其返回给调用者。在完成查询和预编译之后,它简单地总结为先预编译该语句,然后设置参数(类似于JDBC的准备语句过程)。最后,如果有查询结果,它将被组装并返回。

首先,以SimpleExecutor为例,看一下源代码,我们得到以下重要知识点:

首先,通过从配置对象的newExecutor()方法中选择相应的执行器来生成执行器

(注意:最后,动态代理的层是在interceptorChain.pluginAll()中执行的。最后,在调用真正的Executor之前可以修改插件代码,这也是为什么学Mybatis的插件一定要知道SqlSession的运行过程。)

第二:StatementHandler是根据执行器中的配置构建的

第三,执行器将执行StatementHandler的prepare()方法预编译——填入连接对象和其他参数——然后调用parameterize()方法设置参数——完成预编译

综上所述,画一个简单的思维图如下:

(其中:getParameterObject是返回参数对象,setParameters()是设置的预编译参数)

第二:从parameterObject获取参数,然后使用typeHandler(在Configuration中注册)处理参数:

函数:很简单,就是汇编结果返回结果集

首先,结果集处理程序接口handlerResultSets()包装并返回结果集,而handleOutputParameters()处理存储过程输出参数

第二:Mybatis提供了默认的ResultSetHandler实现类default ResultSetHandler,重点是handlerResultSets()的实现,但是其实现过程比较复杂,这里就不介绍了(emmmmm...个人目前的能力仍然被理解,并且仍然需要努力)

第三,执行器中的doQuery()方法返回封装的结果集

第四,实际上,结果是通过调用结果集处理程序的handleResultSets()方法返回的

SqlSession的运行主要依靠执行器调用(调度)StatementHandler、parameterHanlder和ResultSetHandler。执行器首先通过创建雄蕊tHandler来执行预编译和设置运行参数,整个过程需要以下步骤:

1)准备预编译的SQL

自适应模式生成的RoutingStatementHandler根据上下文选择生成三个对应的XXXStatementHandler

在生成的XXXStatementHandler内的instantiateStatement()方法中执行底层JDBC的prepareStatement()方法,以完成预编译

2)参数化设置参数

默认情况下,默认参数处理程序(实现参数处理程序接口)中的setParameter()方法完成参数配置,其中参数从ParameterObject中取出,并移交给typeHandler进行处理

3)doUpdate/doQuery执行SQL

返回的结果由默认的默认结果集处理程序(实现结果集处理程序接口)封装

1)SqlSession内部通用操作图

2)准备()方法的操作图:3)参数化()方法的操作图

1.《parameterize Mybatis的SqlSession运行原理》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《parameterize Mybatis的SqlSession运行原理》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/887858.html

上一篇

"奥特曼"创业擦鞋 究竟是什么情况?具体事件详情是怎样的?

下一篇

Amy姐否认开天王嫂培训班 到底原因是什么

青岛核酸检测已采样超750万份 目前检测结果如何

青岛核酸检测已采样超750万份 目前检测结果如何

青岛已经采集了750多万份核酸样本。近日,一则“青岛已采样核酸750多万份”的新闻引发热议。据悉,根据青岛市最新疫情报告,已抽取7502720份样本进行SARS-CoV-2核酸检测,除确诊病例和无症状感染者外,未发现新的阳性样本。据报道,10月14日9时30分,全市共检测出532名密切接触者,均已实施集中隔离...

弗洛伊德尸检报告 具体是什么情况报告结果是

弗洛伊德尸检报告 具体是什么情况报告结果是

据新华社报道,美国明尼苏达州亨内平县法医办公室6月1日发表声明称,非裔美国公民乔治·弗洛伊德(George Floyd)在被警方羁押期间死于凶杀,与“颈部压迫”有关。弗洛伊德的家庭律师表示,独立尸检发现,乔治·弗洛伊德的死亡模式是“颈部和背部受压导致脑部血液循环而窒息致死”。46岁的弗洛伊德是一名保安,在美国...

武汉市集中核酸检测总支出大约9亿元 最终检测结果如何

武汉市集中核酸检测总支出大约9亿元 最终检测结果如何

6月2日,新冠肺炎肺炎疫情防控指挥部召开新闻发布会。在新闻发布会上,武汉市委常委、常务副市长胡亚波表示,经过10多天的努力,武汉成功完成了核酸集中检测任务,费用由政府承担。通过集中采购降低成本,总支出约9亿元。武汉市核酸集中检测总支出约9亿元据报道,5月14日00时至6月1日24时,武汉共检出9899828人...

武汉通报集中核酸检测排查结果 排查多少人结果怎样

武汉通报集中核酸检测排查结果 排查多少人结果怎样

6月2日,湖北省新冠肺炎肺炎疫情防控指挥部举行第104次新闻发布会。会上,湖北省有关领导介绍,武汉通报了核酸集中检测结果。5月14日00时至6月1日24时,武汉市共检出9899828人,未发现确诊病例。检出无症状感染者300人,检出率0.303/ 10000,随访密切接触者1174人。核酸检测结果均为阴性,医...

涨停板预测 股神偷偷透漏了一个找涨停板的方法

  • 涨停板预测 股神偷偷透漏了一个找涨停板的方法
  • 涨停板预测 股神偷偷透漏了一个找涨停板的方法
  • 涨停板预测 股神偷偷透漏了一个找涨停板的方法

涨停版预测 股神偷偷透漏了一个找涨停板的方法

  • 涨停版预测 股神偷偷透漏了一个找涨停板的方法
  • 涨停版预测 股神偷偷透漏了一个找涨停板的方法
  • 涨停版预测 股神偷偷透漏了一个找涨停板的方法
建行网银盾 建行网银盾被锁定怎么办,建行网盾被锁解决方法

建行网银盾 建行网银盾被锁定怎么办,建行网盾被锁解决方法

建行网银盾锁了怎么办?建行的二代网银盾可以解锁,但是需要在有移动终端的网络上办理。 网银盾密码连续6次输入错误后,网银盾将被锁定。如果你的网银盾被锁住了,请去建设解锁。 同时也有卡友提醒你,你当地建行网点有移动终端。可以用身份证、相关账号、二代网络银盾重置密码,非常方便。不需要新的网银盾。不...

建设银行网银盾 建行网银盾被锁定怎么办,建行网盾被锁解决方法

建设银行网银盾 建行网银盾被锁定怎么办,建行网盾被锁解决方法

建行网银盾锁了怎么办?建行的二代网银盾可以解锁,但是需要在有移动终端的网络上办理。 网银盾密码连续6次输入错误后,网银盾将被锁定。如果你的网银盾被锁住了,请去建设解锁。 同时也有卡友提醒你,你当地建行网点有移动终端。可以用身份证、相关账号、二代网络银盾重置密码,非常方便。不需要新的网银盾。不...