丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

當(dāng)前位置:首頁(yè) > 時(shí)尚生活

分頁(yè)控件 Mybatis插件原理和PageHelper結(jié)合實(shí)戰(zhàn)分頁(yè)插件(七)

過(guò)往精彩文章:

Mybatis源代碼分析的SqlSessionFactory(一)

Mybatis源代碼分析的任務(wù)和執(zhí)行程序(2)

Mybatis源代碼分析的映射器SQL執(zhí)行過(guò)程(3)

Mybatis源代碼分析中緩存一級(jí)緩存的原理(4)

Mybatis源代碼分析中緩存二級(jí)緩存的原理(5)

將米巴蒂斯與redis聯(lián)合對(duì)抗L2秘藏(六)

今天給大家分享一個(gè)PageHelper,mybatis的分頁(yè)插件。在解釋PageHelper之前,我們需要了解mybatis的插件原理。分頁(yè)

官方網(wǎng)站:https://github.com/pagehelper/Mybatis-PageHelper

一、插件接口

Mybatis定義了一個(gè)插件接口org。阿帕奇。伊巴蒂斯。插件。攔截器。任何自定義插件都需要實(shí)現(xiàn)這個(gè)接口,PageHelper實(shí)現(xiàn)了接口的改變

package org . Apache . ibatis . plugin;

導(dǎo)入Java . util . properties;

/**

* @作者克林頓Begin

*/

公共接口攔截器{

對(duì)象攔截(調(diào)用調(diào)用)拋出可拋出;

對(duì)象插件(對(duì)象目標(biāo));

無(wú)效設(shè)置屬性(屬性屬性);

}

1:攔截?cái)r截器,會(huì)直接覆蓋你攔截對(duì)象的真實(shí)方法。

2.這是一個(gè)生成動(dòng)態(tài)代理對(duì)象的方法

3:設(shè)置屬性它允許您在使用插件時(shí)設(shè)置參數(shù)值。

看com。github。pagehelper。pagehelper的分頁(yè)實(shí)現(xiàn)

/**

* Mybatis攔截器方法

*

* @param調(diào)用攔截器輸入

* @return返回執(zhí)行結(jié)果

* @ Throwable拋出異常

*/

公共對(duì)象攔截(調(diào)用調(diào)用)引發(fā)可投擲{

if (autoRuntimeDialect) {

SqlUtil sqlUtil = getSqlUtil(調(diào)用);

返回sqlUtil.processPage(調(diào)用);

if(自動(dòng)啟用){

initSqlUtil(調(diào)用);

}

返回sqlUtil.processPage(調(diào)用);

}

}

這個(gè)方法獲取分頁(yè)核心代碼并重構(gòu)BoundSql對(duì)象,這將在下面詳細(xì)分析

/**

*僅阻止執(zhí)行者

*

* @param目標(biāo)

* @返回

*/

公共對(duì)象插件(對(duì)象目標(biāo)){

Executor的目標(biāo)實(shí)例){

return Plugin.wrap(target,this);

返回目標(biāo);

}

}

這個(gè)方法是截取執(zhí)行器

/**

*設(shè)置屬性值

*

* @param p屬性值

*/

public void set Properties(Properties p){

checkVersion

//如果有多個(gè)數(shù)據(jù)源,獲取jdbcurl后是否關(guān)閉數(shù)據(jù)源

string CloseConn = p . GetProperty(" CloseConn ");

//求解#97

if(stringutil . isnotempty(CloseConn)){

this . closeConn = boolean . parse boolean(closeConn);

}

//初始化SqL的PARAMS

SqL . SetParAms(p . GetProperty(" params ");

//數(shù)據(jù)庫(kù)方言

字符串方言= p.getProperty("方言");

string RuntimeVaLue = p . GetProperty(" AutoRuntimeDilect ");

if(StrIngutil . iSNotempty(RuntimeFality))& amp;& amp運(yùn)行時(shí)方言. equalsignorecase(" TRUE "){

this . AutoRuntimediaSelect = true;

this.autoDialect = false

this . properties = p;

} else if (StringUtil.isEmpty(方言)){

自動(dòng)學(xué)習(xí)=真;

this . properties = p;

自動(dòng)學(xué)習(xí)=假;

sqlUtil =新sqlUtil(方言);

SqL . SetPropertieS(p);

}

}

基本屬性設(shè)置

二、插件初始化

初始化和所有mybatis初始化一樣。在上一篇文章中,已經(jīng)分析了Mybatis源代碼分析的SqlSessionFactory (I)

私有void pluginElement(XNode父級(jí))引發(fā)異常{

if (parent!= ) {

for (XNode子項(xiàng):parent.getChildren) {

string interceptor = child . GetStringAttribute(" interceptor ");

properties properties = child . getchildrenaspproperties;

攔截器攔截器=(攔截器)解析器類(攔截器)。newInstance

interceptionrinsitivity . set properties(properties);

configuration.a ddInterceptor(攔截器狀態(tài));

}

}

}

這里說(shuō)的是多個(gè)實(shí)例化的插件對(duì)象放入配置,addInterceptor最后存儲(chǔ)在一個(gè)列表中,以為這樣可以同時(shí)存儲(chǔ)多個(gè)插件

第三,外掛攔截

該插件可以攔截mybatis的四個(gè)主要對(duì)象:ParameterHandler、ResultSetHandler、StatementHandler和Executor。源代碼如下

您可以在配置類中找到它

PageHelper使用Executor進(jìn)行攔截,這在上面的源代碼中已經(jīng)可以看到。

讓我看看上圖中的newExecutor方法

Executor =(Executor)interceptor chain . pluginal(Executor);

這是為了生成一個(gè)代理對(duì)象,并在生成代理對(duì)象時(shí)運(yùn)行調(diào)用方法

四.插件操作

Mybatis自帶Plugin方法,源代碼如下

公共類插件實(shí)現(xiàn)InvocationHandler {

私有對(duì)象目標(biāo);

私人截?fù)魴C(jī);

私人地圖& lt類別<。?>。,Set & lt方法>。>。signatureMap

私有插件(對(duì)象目標(biāo),攔截器攔截器,映射& lt類別<。?>。,Set & lt方法>。>。signatureMap) {

this.target = target

this.interceptor = interceptor

this . signatureMap = signatureMap;

}

公共靜態(tài)對(duì)象包裝(對(duì)象目標(biāo),攔截器){

地圖<。類別<。?>。,Set & lt方法>。>。signatureMap = getSignatureMap(攔截器);

類別<。?>。type = target.getClass

類別<。?>。interfaces = getAllInterfaces(類型,signatureMap);

if(interfaces . length & gt;0) {

return Proxy.newProxyInstance(

type.getClassLoader,

界面,

新插件(目標(biāo)、攔截器、簽名映射);

}

返回目標(biāo);

}

公共對(duì)象調(diào)用(對(duì)象代理、方法方法、對(duì)象[]參數(shù))引發(fā)可投擲{

Set<。方法>。methods = signaturemap . get(method . getdeclaringclass);

if (methods!= & amp& ampmethods.contains(method)) {

return interceptor . intercept(new Invocation(target,method,args));

}

return method.invoke(target,args);

throw ExceptionTil . Unwrapthrowable(e);

}

}

私有靜態(tài)地圖& lt類別<。?>。,Set & lt方法>。>。getSignatureMap(攔截器攔截器){

intercepts intercepts sannotation = interceptor . GetClass . GetAnnotation(intercepts . Class);

//第251期

if (interceptsAnnotation == ) {

拋出新的PluginException("在interceptor中找不到@Intercepts注釋"+interceptor . getclass . getname);

}

sigs = interceptSannotation . value;

地圖<。類別<。?>。,Set & lt方法>。>。signatureMap = new HashMap & lt類別<。?>。,Set & lt方法>。>。;

for(簽名:sigs) {

Set<。方法>。methods = SignatureMap . get(SIG . type);

if (methods == ) {

methods = new HashSet & lt方法>。;

signatureMap.put(sig.type,methods);

}

嘗試{

method method = SIG . type . GetMethod(SIG . method,SIG . args);

methods . a DD(method);

} catch(NoSuchMethodException e){

拋出新的插件異常(“在名為“+ sig.method +”的“+ sig.type +”上找不到方法”。起因:“+ e,e);

}

}

返回簽名映射;

}

私有靜態(tài)類& lt?>。getAllInterfaces(Class & lt;?>。類型,地圖& lt類別<。?>。,Set & lt方法>。>。signatureMap) {

Set<。類別<。?>。>。interfaces = new HashSet & lt類別<。?>。>。;

while(鍵入!= ) {

for(Class & lt;?>。c : type.getInterfaces) {

if(signaturemap . Contains KeY(c)){

interfaces . a DD(c);

}

}

type = type.getSuperclass

}

返回接口到數(shù)組(新類& lt?>。[interfaces . size]);

}

}

wrap方法是生成一個(gè)動(dòng)態(tài)代理類。

Invoke方法是一種代理綁定方法,它首先確定簽名類和方法是否存在,如果不存在,則直接反映分派被攔截對(duì)象的方法;如果它們存在,調(diào)度插件的攔截器方法,然后初始化一個(gè)調(diào)用對(duì)象

讓我們具體看看PageHelper。當(dāng)它被執(zhí)行調(diào)用時(shí),程序?qū)⑻D(zhuǎn)到頁(yè)面幫助器

公共對(duì)象攔截(調(diào)用調(diào)用)引發(fā)可投擲{

if (autoRuntimeDialect) {

SqlUtil sqlUtil = getSqlUtil(調(diào)用);

返回sqlUtil.processPage(調(diào)用);

if(自動(dòng)啟用){

initSqlUtil(調(diào)用);

}

返回sqlUtil.processPage(調(diào)用);

}

}

我們正在研究sqlUtil.processPage方法

/**

* Mybatis攔截器方法,這一步是嵌套的,以便在出現(xiàn)異常時(shí)清除空Threadlocal。

*

* @param調(diào)用攔截器輸入

* @return返回執(zhí)行結(jié)果

* @ Throwable拋出異常

*/

公共對(duì)象進(jìn)程頁(yè)(調(diào)用調(diào)用)拋出可拋出的{

對(duì)象結(jié)果= _processPage(調(diào)用);

返回結(jié)果;

clearLocalPage

}

}

繼續(xù)跟進(jìn)

/**

* Mybatis攔截器方法

*

* @param調(diào)用攔截器輸入

* @return返回執(zhí)行結(jié)果

* @ Throwable拋出異常

*/

私有對(duì)象_進(jìn)程頁(yè)面(調(diào)用調(diào)用)拋出可拋出的{

Object final args = invoke . GetArgs;

page page =;

//當(dāng)支持方法參數(shù)時(shí),嘗試首先獲取Page

if (supportMethodsArguments) {

page = GetPage(args);

}

//分頁(yè)信息

行邊界行邊界=(行邊界)參數(shù)[2];

//當(dāng)支持方法參數(shù)時(shí),如果page ==,表示沒(méi)有分頁(yè)條件,不需要分頁(yè)查詢。

if((supportMethodsArguments & amp;& amppage ==)

//當(dāng)不支持分頁(yè)參數(shù)時(shí),判斷LocalPage和RowBounds,判斷是否需要分頁(yè)。

|| (!supportMethodsArguments & amp& ampSqlUtil.getLocalPage = = & amp& amprowBounds == RowBounds。DEFAULT){

返回調(diào)用。繼續(xù);

//不支持分頁(yè)參數(shù)時(shí),page==,這里需要獲取

if(!supportMethodsArguments & amp& amppage == ) {

page = GetPage(args);

}

返回doProcessPage(調(diào)用、頁(yè)面、參數(shù));

}

}

這些只是打包頁(yè)面的方法,真正的核心是doProcessPage

/**

* Mybatis攔截器方法

*

* @param調(diào)用攔截器輸入

* @return返回執(zhí)行結(jié)果

* @ Throwable拋出異常

*/

私有頁(yè)面進(jìn)程頁(yè)面(調(diào)用調(diào)用,頁(yè)面頁(yè)面,對(duì)象[]參數(shù))拋出可拋出{

//保存行邊界狀態(tài)

行邊界行邊界=(行邊界)參數(shù)[2];

//獲取原ms

Mapped statement ms =(Mapped statement)參數(shù)[0];

//確定并作為頁(yè)面資源進(jìn)行處理

if(!isPageSqlSource(ms)) {

processMappedStatement

}

//設(shè)置當(dāng)前解析器,每次使用前都會(huì)設(shè)置,ThreadLocal的值不會(huì)有不良影響

((PageSqlSource)ms.getSqlSource)。setParser(解析器);

//忽略row bounds——否則會(huì)在Mybatis中進(jìn)行內(nèi)存分頁(yè)

args[2] = RowBounds。DEFAULT

//如果只做排序或頁(yè)面大小零判斷,

if (isQueryOnly(page)) {

返回doQueryOnly(頁(yè)面,調(diào)用);

}

//簡(jiǎn)單的根據(jù)total的值來(lái)判斷是否查詢count

if (page.isCount) {

page.setCountSignal(布爾值。真);

//替換MS

args[0]= MsCountMap . get(ms . GetiD);

//查詢總數(shù)

Object result = .繼續(xù);

//還原ms

args[0]= ms;

//設(shè)置總數(shù)

page.setTotal((整數(shù))((列表)結(jié)果)。get(0));

if (page.getTotal == 0) {

返回頁(yè)面;

}

page . SetTotal(-1l);

}

//pageSize >0,頁(yè)面大小

if(page . GetPageSize & gt;0 & amp& amp

((rowBounds == RowBounds。DEFAULT & amp& amppage.getPageNum & gt0)

|| rowBounds!= RowBounds。DEFAULT){

//用新的qs替換參數(shù)中的MappedStatement

page . setcountssignal;

BoundSql BoundSql = ms . GetBoundSql(args[1]);

args[1]= parser . SetPageParameter(ms,args[1],boundSql,page);

page.setCountSignal(布爾值。FALSE);

//執(zhí)行分頁(yè)查詢

Object result = .繼續(xù);

//獲取處理結(jié)果

page.a ddAll((List)結(jié)果);

}

((PageSqlSource)ms.getSqlSource)。removeParser

}

//返回結(jié)果

返回頁(yè)面;

}

有兩個(gè)對(duì)象結(jié)果=調(diào)用。繼續(xù)上面的執(zhí)行,第一個(gè)是執(zhí)行統(tǒng)計(jì)的總數(shù),第二個(gè)是執(zhí)行分頁(yè)查詢的數(shù)據(jù)

里面用的是特工。最后,第一次返回總頁(yè)數(shù),第二次獲取分頁(yè)數(shù)據(jù)。

動(dòng)詞 (verb的縮寫)頁(yè)面助手的使用

上面解釋了Mybatis的插件原理和PageHelper的內(nèi)部實(shí)現(xiàn),下面具體描述了PageHelper的使用

1.首先增加對(duì)maven的依賴:

& lt依賴性>。

& ltgroupId>。com . github . page helper & lt;/groupId>。

& ltartifactId>。pagehelper<。/artifactId >

& lt版本>。4.1.6<。/version>。

& lt/依賴性

2.將以下配置添加到configuration.xml文件中(插件應(yīng)該在環(huán)境之上)

& lt插件>。

& lt!-頁(yè)面幫助4 . 1 . 6->;

& ltplugin interceptor = " com . github . page helper . PageHelper " >;

& ltproperty name= "方言" value="mysql"/>

& ltproperty name = " offsetapagenum " value = " false "/>

& ltproperty name = " RowBoundsWithCount " value = " false "/>

& ltproperty name = " page SiZe zero " value = " true "/>

& ltproperty name= "合理" value="false"/>。

& ltproperty name = " SupportMethodArguments " value = " false "/& gt;

& ltproperty name = " returnPageInfo " value = " none "/& gt;

& lt/plugin>。

& lt/plugins>。

相關(guān)的字段描述可以在SqlUtilConfig源代碼中找到

當(dāng)訂單不能出現(xiàn)故障時(shí),請(qǐng)注意配置,否則將報(bào)告錯(cuò)誤

原因:org . Apache . ibatis . builder . Builderexception:創(chuàng)建文檔實(shí)例時(shí)出錯(cuò)。原因:org . XML . sax . SaxParseException;行號(hào):57;列號(hào):17;元素類型為“配置”的內(nèi)容必須匹配(屬性?,設(shè)置?,類型別名?,typeHandlers?,objectFactory?,objectWrapperFactory?,外掛?,環(huán)境?,databaseIdProvider?mappers?)"。

at org . Apache . ibatis . parsing . XPath parser . create document(XPath parser . Java:259)

at org . Apache . ibatis . parsing . XPath parser . & lt;init>。(XPathParser.java:120)

at org . Apache . ibatis . builder . XML . XMLConfigbuilder . & lt;init>。(XMLConfigBuilder.java:66)

at . org . Apache . ibatis . session . SqlsessionfactoryBuilder . build(SqlsessionfactoryBuilder . Java:49)

...2個(gè)以上

這意味著配置中節(jié)點(diǎn)的順序是屬性->:設(shè)置->;類型別名->;typenhandlers->;對(duì)象工廠->;objectwrappperfactory->;插件->;環(huán)境->;databaseidProvider->;映射器插件應(yīng)該在環(huán)境之前和objectWrapperFactory之后,這個(gè)順序不能打亂

3.特定用途

1:分頁(yè)

SqL session = SessionFactory . OpenSession;

user mapper user mapper = SQL session . GetMapper(user mapper . class);

PageHelper.startPage(1,10,true);//第一頁(yè)每頁(yè)顯示10個(gè)項(xiàng)目

頁(yè)面<。用戶>。page = userMapper.findUserAll

2.沒(méi)有分頁(yè)

PageHelper.startPage(1,-1,true);

3:查詢文章總數(shù)

PageInfo<。用戶>。info =新頁(yè)面信息<。>。(user mapper . FindUserAll);

1.《分頁(yè)控件 Mybatis插件原理和PageHelper結(jié)合實(shí)戰(zhàn)分頁(yè)插件(七)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《分頁(yè)控件 Mybatis插件原理和PageHelper結(jié)合實(shí)戰(zhàn)分頁(yè)插件(七)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/shehui/1084817.html

上一篇

休假戰(zhàn)士被爆炸氣浪沖飛仍救火 現(xiàn)場(chǎng)曝光令人揪心

下一篇

開(kāi)發(fā)商做假地鐵站牌忽悠購(gòu)房者 后續(xù)結(jié)果是什么

瘊子的最佳治療方法 治療尋常疣這三種方法最好不要選!

  • 瘊子的最佳治療方法 治療尋常疣這三種方法最好不要選!
  • 瘊子的最佳治療方法 治療尋常疣這三種方法最好不要選!
  • 瘊子的最佳治療方法 治療尋常疣這三種方法最好不要選!

starnet 值得收藏!基于激光雷達(dá)數(shù)據(jù)的深度學(xué)習(xí)目標(biāo)檢測(cè)方法大合集(下)

  • starnet 值得收藏!基于激光雷達(dá)數(shù)據(jù)的深度學(xué)習(xí)目標(biāo)檢測(cè)方法大合集(下)
  • starnet 值得收藏!基于激光雷達(dá)數(shù)據(jù)的深度學(xué)習(xí)目標(biāo)檢測(cè)方法大合集(下)
  • starnet 值得收藏!基于激光雷達(dá)數(shù)據(jù)的深度學(xué)習(xí)目標(biāo)檢測(cè)方法大合集(下)

信息資源管理方法 2019中國(guó)信息資源管理論壇暨第四屆大數(shù)據(jù)與信息資源管理協(xié)同創(chuàng)新共同體學(xué)術(shù)研討會(huì)

  • 信息資源管理方法 2019中國(guó)信息資源管理論壇暨第四屆大數(shù)據(jù)與信息資源管理協(xié)同創(chuàng)新共同體學(xué)術(shù)研討會(huì)
  • 信息資源管理方法 2019中國(guó)信息資源管理論壇暨第四屆大數(shù)據(jù)與信息資源管理協(xié)同創(chuàng)新共同體學(xué)術(shù)研討會(huì)
  • 信息資源管理方法 2019中國(guó)信息資源管理論壇暨第四屆大數(shù)據(jù)與信息資源管理協(xié)同創(chuàng)新共同體學(xué)術(shù)研討會(huì)
瓷管 無(wú)主之地3瓷管炸彈怎么得 獲得瓷管手雷方法

瓷管 無(wú)主之地3瓷管炸彈怎么得 獲得瓷管手雷方法

在《無(wú)土地3》中,瓷管炸彈是游戲中非常有用的手雷道具,可以殺死一堆敵人或者對(duì)BOSS造成致命傷害。如何拿到瓷管彈,下面是具體方法。 在《無(wú)土地3》中,瓷管炸彈是游戲中非常有用的手雷道具,可以殺死一堆敵人或者對(duì)BOSS造成致命傷害。如何拿到瓷管彈,下面是具體方法。 瓷管炸彈是通過(guò)任務(wù)獲得的。第...

家?;疱侂u的制作方法 正宗重慶肥腸雞火鍋的做法【步驟】

晚上打呼嚕的治療方法 睡覺(jué)打呼嚕怎么治?

  • 晚上打呼嚕的治療方法 睡覺(jué)打呼嚕怎么治?
  • 晚上打呼嚕的治療方法 睡覺(jué)打呼嚕怎么治?
  • 晚上打呼嚕的治療方法 睡覺(jué)打呼嚕怎么治?

單純皰疹的治療方法 這才是口腔單純性皰疹最快的治療辦法,你也許不知道!

引導(dǎo)語(yǔ)言 你知道口腔單純皰疹的正確治療方法嗎? 疾病淺析 口腔單純皰疹病毒(HSV)感染稱為口腔單純皰疹。HSV感染者和病毒攜帶者是傳染源,主要通過(guò)直接接觸飛沫、唾液和皰疹液,也可通過(guò)餐具和衣物間接接觸。單純皰疹病毒感染引起的口腔黏膜病變包括原發(fā)性單純皰疹感染和復(fù)發(fā)性單純皰疹感染。 癥狀表現(xiàn)...

求項(xiàng)數(shù)的公式 高中數(shù)學(xué):求數(shù)列前n項(xiàng)和的七種方法和技巧

求項(xiàng)數(shù)的公式 高中數(shù)學(xué):求數(shù)列前n項(xiàng)和的七種方法和技巧

我們不在乎在高考題或相關(guān)試題中是否會(huì)出現(xiàn)求數(shù)列中N項(xiàng)之和的問(wèn)題。當(dāng)然,可能性很大。關(guān)鍵是通過(guò)學(xué)習(xí)和討論求數(shù)列前N項(xiàng)之和的方法,了解學(xué)習(xí)和思考的方法。幾種求和方法結(jié)合了數(shù)學(xué)變形與分析、歸納與總結(jié)、簡(jiǎn)化與困難的思想,系統(tǒng)地訓(xùn)練和提高思維。學(xué)習(xí)的主要目的是開(kāi)闊思維,提高思維。 通常有以下七種方法和...