最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解

 更新時(shí)間:2020年02月25日 12:17:30   作者:---WeiGeH  
這篇文章主要介紹了Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1.Plugin

MyBatis 允許使用插件來(lái)攔截的方法調(diào)用包括:

  • • Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
  • • ParameterHandler (getParameterObject, setParameters)
  • • ResultSetHandler (handleResultSets, handleOutputParameters)
  • • StatementHandler (prepare, parameterize, batch, update, query)

注意;可以通過(guò)插件攔截到這四個(gè)對(duì)象,修改參數(shù)等操作:

你必須要知道的類:

  • org.apache.ibatis.plugin.Plugin
  • org.apache.ibatis.reflection.SystemMetaObject

2.使用步驟

實(shí)現(xiàn) Interceptor 接口

三個(gè)方法執(zhí)行順序

  • setProperties()
  • plugin()
  • intercept()
FirstIntercepter=====>setProperties
FirstIntercepter====>pluginorg.apache.ibatis.executor.CachingExecutor@64485a47
FirstIntercepter====>pluginorg.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
DEBUG 09-05 11:56:24,696 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
FirstIntercepter:===>intercept
DEBUG 09-05 11:56:24,722 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 11:56:24,739 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=1, lastName=tom, gender=1, email=asd@qq.com, depid=null]

給你的攔截器簽名:

/**
* 完成插件簽名:
* 告訴MyBatis當(dāng)前插件用來(lái)攔截哪個(gè)對(duì)象的哪個(gè)方法
* type:要攔截的四大類型
* method:攔截那個(gè)方法
* args:這個(gè)方法的入?yún)?
* */
@Intercepts({
@Signature(type=StatementHandler.class,
method="parameterize",
args=java.sql.Statement.class
)
})
public class FirstIntercepter implements Interceptor

mybatis-cfg.xml中配置插件

這里注意配置plugins的標(biāo)簽順序,以免出錯(cuò),在environments上面

<!-- plugins 插件的配置 實(shí)際上是使用:intercepter原理代理的 -->
<plugins>
<plugin interceptor="mybatis.intercepter.FirstIntercepter">
<property name="param1" value="root"/>
<property name="param2" value="root"/>
</plugin>
</plugins>

3.多個(gè)插件的執(zhí)行

多個(gè)插件依次生成目標(biāo)對(duì)象的代理對(duì)象,層層包裹,先聲明的先包裹;形成代理鏈

可以理解為:初始化執(zhí)行

執(zhí)行l(wèi)og

FirstIntercepter=====>setProperties

MySecondIntercepter====>setProperties:{param1=root}
FirstIntercepter====>pluginorg.apache.ibatis.executor.CachingExecutor@64485a47
MySecondIntercepter====>plugin:org.apache.ibatis.executor.CachingExecutor@64485a47
FirstIntercepter====>pluginorg.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
MySecondIntercepter====>plugin:org.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
MySecondIntercepter====>plugin:org.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
MySecondIntercepter====>plugin:org.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
DEBUG 09-05 12:07:01,928 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
MySecondIntercepter====>intercept:public abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
FirstIntercepter:===>intercept
DEBUG 09-05 12:07:01,954 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 12:07:01,968 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=1, lastName=tom, gender=1, email=asd@qq.com, depid=null]

4.實(shí)現(xiàn)攔截修改參數(shù)

sql

<!-- Employee getSelectEmp(Integer id); -->
<select id="getSelectEmp" parameterType="java.lang.Integer"
resultType="mybatis.bean.Employee">
select * from employee where id=#{id}
</select>

這里我們攔截id:

由于ibatis中參數(shù)的聲明存在與 StatementHandler中所以注意簽名

@Intercepts({
@Signature(type=StatementHandler.class,
method="parameterize",
args=java.sql.Statement.class
)
})

業(yè)務(wù)邏輯intercept方法中

/**
* 1:業(yè)務(wù)邏輯處理的方法:
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
//在這里可以進(jìn)行業(yè)務(wù)邏輯修改
System.out.println("FirstIntercepter:===>intercept"+invocation.getMethod());
 
MetaObject metaObject = SystemMetaObject.forObject(invocation.getTarget());
//拿到target的元數(shù)據(jù) StatementHandler==>ParameterHandler===>
//DefaultParameterHandler==>>parameterObject
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("sql "+value.toString());
//修改完sql語(yǔ)句要用的參數(shù)
metaObject.setValue("parameterHandler.parameterObject", 2);
Object object = invocation.proceed();
return object;
}

打印log,

可以看到原來(lái)入?yún)?,現(xiàn)在經(jīng)過(guò)攔截器修改入?yún)?

DEBUG 09-05 12:36:23,387 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
MySecondIntercepter====>intercept:public abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
FirstIntercepter:===>interceptpublic abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
sql 1
DEBUG 09-05 12:36:23,418 ==> Parameters: 2(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 12:36:23,432 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=2, lastName=cat, gender=0, email=qwe@qq.com, depid=null]

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot應(yīng)用監(jiān)控的實(shí)戰(zhàn)教程

    Spring Boot應(yīng)用監(jiān)控的實(shí)戰(zhàn)教程

    Spring Boot 提供運(yùn)行時(shí)的應(yīng)用監(jiān)控和管理功能,下面這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用監(jiān)控的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Java8新特性之Stream使用詳解

    Java8新特性之Stream使用詳解

    這篇文章主要介紹了Java8新特性之Stream使用詳解,流是用來(lái)處理集合中的數(shù)據(jù),以聲明的形式操作集合,它就像SQL語(yǔ)句,我們只需告訴流需要對(duì)集合進(jìn)行什么操作,它就會(huì)自動(dòng)進(jìn)行操作,并將執(zhí)行結(jié)果交給你,無(wú)需我們自己手寫(xiě)代碼,需要的朋友可以參考下
    2023-08-08
  • Springboot?內(nèi)部服務(wù)調(diào)用方式

    Springboot?內(nèi)部服務(wù)調(diào)用方式

    這篇文章主要介紹了Springboot?內(nèi)部服務(wù)調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問(wèn)題

    jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問(wèn)題

    這篇文章主要介紹了jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問(wèn)題,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • Java實(shí)現(xiàn)權(quán)重隨機(jī)算法詳解

    Java實(shí)現(xiàn)權(quán)重隨機(jī)算法詳解

    平時(shí),經(jīng)常會(huì)遇到權(quán)重隨機(jī)算法,從不同權(quán)重的N個(gè)元素中隨機(jī)選擇一個(gè),并使得總體選擇結(jié)果是按照權(quán)重分布的。本文就詳細(xì)來(lái)介紹如何實(shí)現(xiàn),感興趣的可以了解一下
    2021-07-07
  • Spring中Bean的生命周期實(shí)例講解

    Spring中Bean的生命周期實(shí)例講解

    這篇文章主要介紹了Spring中Bean的生命周期講解,而Spring中的一個(gè)Bean從開(kāi)始到結(jié)束經(jīng)歷很多過(guò)程,但總體可以分為六個(gè)階段Bean定義、實(shí)例化、屬性賦值、初始化、生存期、銷毀,需要的朋友可以參考下
    2023-08-08
  • Mybatis實(shí)現(xiàn)增刪改查及分頁(yè)查詢的方法

    Mybatis實(shí)現(xiàn)增刪改查及分頁(yè)查詢的方法

    MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持 久層框架,通過(guò)本文給大家介紹Mybatis實(shí)現(xiàn)增刪改查及分頁(yè)查詢的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問(wèn)題

    IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問(wèn)題

    這篇文章主要介紹了IDEA2020 Plugins不能用的解決辦法,文中給大家介紹了Intellij IDEA 2020.1 的Plugins 搜索不了插件,連接超時(shí)的問(wèn)題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-06-06
  • Java中的RestTemplate使用詳解

    Java中的RestTemplate使用詳解

    這篇文章主要介紹了Java中的RestTemplate使用詳解,Spring內(nèi)置了RestTemplate作為Http請(qǐng)求的工具類,簡(jiǎn)化了很多操作,雖然Spring5推出了WebClient,但是整體感覺(jué)還是RestTemplate用起來(lái)更簡(jiǎn)單方便一些,需要的朋友可以參考下
    2023-10-10
  • Java?API文檔的使用方法詳解

    Java?API文檔的使用方法詳解

    在開(kāi)發(fā)過(guò)程中如果遇到疑難問(wèn)題,除了可以在網(wǎng)絡(luò)中尋找答案,也可以在Java API幫助文檔(簡(jiǎn)稱"JDK文檔"”)中查找答案,下面這篇文章主要給大家介紹了關(guān)于Java?API文檔使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

山东省| 慈溪市| 溧阳市| 益阳市| 昭苏县| 大石桥市| 厦门市| 邵阳县| 丹阳市| 克什克腾旗| 普格县| 始兴县| 台安县| 日土县| 肇东市| 河西区| 普定县| 湘潭县| 晋江市| 绥芬河市| 巴马| 石泉县| 吉水县| 葫芦岛市| 南丹县| 栖霞市| 和林格尔县| 桃园县| 宣汉县| 北京市| 武鸣县| 汪清县| 西峡县| 广南县| 佳木斯市| 汉寿县| 梓潼县| 彰化市| 陵川县| 邓州市| 伽师县|