日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你所不知道的mybatis居然也有拦截器

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你所不知道的mybatis居然也有拦截器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于mybatis的攔截器這個想法我來自于三個地方

也就是下面這個三個地方是可以使用的,其他的情況需要開發人員根據實際情況來使用。

1、對于分頁的查詢,我們可以對于分頁的方法采用比較規范的命名,然后根據這個命名來攔截需要分頁查詢的sql然后把分頁的總數,分頁數,頁碼數,頁碼總數等放在一個對象中返回去,這樣分頁只要調用dao的一個方法即可。

2、讀寫分離,我們可以在sql執行之前,獲取sql是不是查詢方法,然后根據這個條件去控制需要訪問的數據源。

3、需要統計分析sql的執行時間(這邊要說的是這里的執行包含了網絡帶寬,因為不是在mysql執行前后做的攔截,所以這里的sql并不只是sql在數據庫真正執行的時間,要比實際長)

?

如何實現這樣一個攔截器

首先mybatis官方早就想到我們開發會有這樣的需求,所以開放了一個org.apache.ibatis.plugin.Interceptor這樣一個接口。

我們只要實現這個接口并且加上注解然后重寫intercept方法。

最后如果你使用的是mybatis.xml也就是mybatis本身單獨的配置,你可以需要在這里配置相應的攔截器名字等。

如果你使用的是spring管理的mybatis,那么你需要在spring配置文件里面配置注冊相應的攔截器。

?

代碼實現

下面對于3,也就是實現統計sql執行時間,簡單摘錄一下實現代碼。

還有兩種開發可以根據自己的想法去實現和摸索。

package com.ssm;import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties;import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.type.TypeHandlerRegistry; import org.apache.log4j.Logger;@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }), @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }) }) public class SqlStatementInterceptor implements Interceptor{ private static Logger logger = Logger.getLogger(SqlStatementInterceptor.class); @SuppressWarnings("unused") private Properties properties; @Override public Object intercept(Invocation arg0) throws Throwable { MappedStatement mappedStatement = (MappedStatement) arg0.getArgs()[0]; Object parameter = null; if (arg0.getArgs().length > 1) { parameter = arg0.getArgs()[1]; } String sqlId = mappedStatement.getId(); BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); Object returnValue = null; long start = System.currentTimeMillis(); returnValue = arg0.proceed(); long end = System.currentTimeMillis(); long time = (end - start); if (time > 1) { String sql = getSql(configuration, boundSql, sqlId, time); logger.error(sql);} return returnValue; } public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) { String sql = showSql(configuration, boundSql); StringBuilder str = new StringBuilder(100); str.append(sqlId); str.append(":"); str.append(sql); str.append(":"); str.append(time); str.append("ms"); return str.toString(); } public static String showSql(Configuration configuration, BoundSql boundSql) { Object parameterObject = boundSql.getParameterObject(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); String sql = boundSql.getSql().replaceAll("[\\s]+", " "); if (parameterMappings.size() > 0 && parameterObject != null) { TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { sql = sql.replaceFirst("\\?", getParameterValue(parameterObject)); } else { MetaObject metaObject = configuration.newMetaObject(parameterObject); for (ParameterMapping parameterMapping : parameterMappings) { String propertyName = parameterMapping.getProperty(); if (metaObject.hasGetter(propertyName)) { Object obj = metaObject.getValue(propertyName); sql = sql.replaceFirst("\\?", getParameterValue(obj)); } else if (boundSql.hasAdditionalParameter(propertyName)) { Object obj = boundSql.getAdditionalParameter(propertyName); sql = sql.replaceFirst("\\?", getParameterValue(obj)); } } } } return sql; } private static String getParameterValue(Object obj) { String value = null; if (obj instanceof String) { value = "'" + obj.toString() + "'"; } else if (obj instanceof Date) { DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); value = "'" + formatter.format(new Date()) + "'"; } else { if (obj != null) { value = obj.toString(); } else { value = ""; } } return value; } @Override public Object plugin(Object arg0) { return Plugin.wrap(arg0, this); } @Override public void setProperties(Properties arg0) { this.properties = arg0; } }

下面是spring中的配置,如果你是單獨配置mybatis配置文件的話,你需要查詢一下如何配置

<!-- 配置mybitasSqlSessionFactoryBean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="typeAliasesPackage" value="com/ssm/entity"></property><property name="mapperLocations" value="classpath*:com/ssm/dao/sqlxml/*.xml"></property><property name="plugins"><array><bean class="com.ssm.SqlStatementInterceptor"><property name="properties"><value>property-key=property-value</value></property></bean></array></property></bean>

會在log日志中輸出最后執行的sql和sqlID和sql執行的時間。

?

?

參考資料:

分頁實現(本人沒有親自實現,因為現實情況還沒有這樣特別需要這樣的業務邏輯):

http://www.cnblogs.com/jethypc/p/5149183.html

執行時間統計實現(我修改了其中spring的配置,不知為何下面博主的配置并沒有用):

http://blog.csdn.net/tq02h2a/article/details/50772652

讀寫分離實現(其中的第四種方案就是利用了攔截器):

http://www.jianshu.com/p/2222257f96d3

轉載于:https://www.cnblogs.com/linkstar/p/6039513.html

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的你所不知道的mybatis居然也有拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产山村乱淫老妇女视频 | 黄色国产视频网站 | 天天干,天天操 | a级片在线 | 中文字幕不卡一区 | 国产肥熟| 精品免费囯产一区二区三区 | 少妇又色又紧又黄又刺激免费 | 波多野结衣av中文字幕 | 亚洲不卡视频在线观看 | 国产黄色一级 | 嫩草视频在线观看视频 | 青青色在线视频 | 国产亚州av | 初尝人妻少妇中文字幕 | 亚洲中文字幕视频一区 | 国产无遮挡又黄又爽又色 | 高清免费av | 国产极品在线播放 | 三级网站在线 | 国产欧美精品一区二区色综合 | 狠狠干中文字幕 | 你懂的在线观看网站 | 首尔之春在线看 | 天天干视频在线观看 | 少妇久久久久久被弄高潮 | 精品国产一区二区三区四区精华 | 99热com| 国产啪视频 | 九九热国产在线 | 午夜成人亚洲理伦片在线观看 | 女人高潮娇喘声mp3 乱色视频 | 久久婷色 | 免费精品 | 6080午夜伦理| 日韩成人在线观看视频 | 丰满少妇一级片 | 天堂网成人 | 日韩3p视频| 一级黄色片看看 | 国精产品一区一区三区有限公司杨 | 99热在线观看精品 | 免费不卡的av | 操小妹影院 | 日韩精品成人在线 | 欧美一级淫片免费视频魅影视频 | 国产偷人 | 毛片一二三区 | 亚洲最新视频 | 美女上床网站 | 黑人性高潮 | 蜜臀久久99精品久久久画质超高清 | 女女同性高清片免费看 | 88av视频 | 中国zzji女人高潮免费 | 噜噜噜久久 | 一区二区欧美在线观看 | 美女自拍偷拍 | 欧美色图13p | 亚洲xx视频 | 亚洲国产精品女人 | 成a人片亚洲日本久久 | 女性向av免费网站 | 久久久久久久穴 | 国产一区二区视频免费在线观看 | 国产精品100 | 最新不卡av | 巨乳动漫美女 | 久久99综合 | 狠狠爱免费视频 | 狠狠爱免费视频 | 麻豆亚洲av成人无码久久精品 | 色综合加勒比 | 国产一区二区三区久久久 | 日韩av在线播放一区 | 91av在线视频播放 | 国产精品v亚洲精品v日韩精品 | 三级视频黄色 | 精品国产一区二区三区在线 | 亚洲熟女少妇一区二区 | 嫩草视频在线看 | jjzz日本视频 | 2017日日夜夜| 亚洲精品成人区在线观看 | 中文字字幕第183页 欧美特级一级片 | 国产精品天美传媒沈樵 | 久久国产色av | 欧美性猛交xxx乱久交 | 波多野结衣理论片 | av每日更新在线观看 | 操大爷影院 | 成人精品亚洲人成在线 | 91亚洲精品久久久蜜桃 | 悠悠av | 成年人免费观看网站 | 欧美变态口味重另类在线视频 | 色婷婷狠狠 | 日韩欧美一区二 | 欧美a级黄色|