电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

mybatis 通過攔截器打印完整的sql語句以及執(zhí)行結(jié)果操作

瀏覽:10日期:2023-10-22 12:14:22

開發(fā)過程中,如果使用mybatis做為ORM框架,經(jīng)常需要打印出完整的sql語句以及執(zhí)行的結(jié)果做為參考。

雖然mybatis結(jié)合日志框架可以做到,但打印出來的通常都是sql和參數(shù)分開的。

有時我們需要調(diào)試這條sql的時候,就需要把參數(shù)填進去,這樣未免有些浪費時間。

此時我們可以通過實現(xiàn)mybatis攔截器來做到打印帶參數(shù)的完整的sql,以及結(jié)果通過json輸出到控制臺。

直接看代碼和使用方法吧:

MyBatis攔截器打印不帶問號的完整sql語句攔截器

import java.text.DateFormat;import java.util.Date;import java.util.List;import java.util.Locale;import java.util.Properties;import java.util.regex.Matcher; import org.apache.commons.collections.CollectionUtils;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.*;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; /** * MyBatis攔截器打印不帶問號的完整sql語句 * * @author gogym * @version 2018年8月13日 * @see MybatisInterceptor * @since */@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})})@SuppressWarnings({'unchecked', 'rawtypes'})public class MybatisInterceptor implements Interceptor{ @Override public Object intercept(Invocation invocation) throws Throwable { try { // 獲取xml中的一個select/update/insert/delete節(jié)點,是一條SQL語句 MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0]; Object parameter = null; // 獲取參數(shù),if語句成立,表示sql語句有參數(shù),參數(shù)格式是map形式 if (invocation.getArgs().length > 1) { parameter = invocation.getArgs()[1]; System.out.println('parameter = ' + parameter); } String sqlId = mappedStatement.getId(); // 獲取到節(jié)點的id,即sql語句的id System.out.println('sqlId = ' + sqlId); BoundSql boundSql = mappedStatement.getBoundSql(parameter); // BoundSql就是封裝myBatis最終產(chǎn)生的sql類 Configuration configuration = mappedStatement.getConfiguration(); // 獲取節(jié)點的配置 String sql = getSql(configuration, boundSql, sqlId); // 獲取到最終的sql語句 System.out.println('sql = ' + sql); } catch (Exception e) { e.printStackTrace(); } // 執(zhí)行完上面的任務(wù)后,不改變原有的sql執(zhí)行過程 return invocation.proceed(); } // 封裝了一下sql語句,使得結(jié)果返回完整xml路徑下的sql語句節(jié)點id + sql語句 public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId) { String sql = showSql(configuration, boundSql); StringBuilder str = new StringBuilder(100); str.append(sqlId); str.append(':'); str.append(sql); return str.toString(); } // 如果參數(shù)是String,則添加單引號, 如果是日期,則轉(zhuǎn)換為時間格式器并加單引號; 對參數(shù)是null和不是null的情況作了處理 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; } // 進行?的替換 public static String showSql(Configuration configuration, BoundSql boundSql) { // 獲取參數(shù) Object parameterObject = boundSql.getParameterObject(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); // sql語句中多個空格都用一個空格代替 String sql = boundSql.getSql().replaceAll('[s]+', ' '); if (CollectionUtils.isNotEmpty(parameterMappings) && parameterObject != null) { // 獲取類型處理器注冊器,類型處理器的功能是進行java類型和數(shù)據(jù)庫類型的轉(zhuǎn)換 TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); // 如果根據(jù)parameterObject.getClass()可以找到對應(yīng)的類型,則替換 if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { sql = sql.replaceFirst('?', Matcher.quoteReplacement(getParameterValue(parameterObject))); } else { // MetaObject主要是封裝了originalObject對象,提供了get和set的方法用于獲取和設(shè)置originalObject的屬性值,主要支持對JavaBean、Collection、Map三種類型對象的操作 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('?', Matcher.quoteReplacement(getParameterValue(obj))); } else if (boundSql.hasAdditionalParameter(propertyName)) { // 該分支是動態(tài)sql Object obj = boundSql.getAdditionalParameter(propertyName); sql = sql.replaceFirst('?', Matcher.quoteReplacement(getParameterValue(obj))); } else { // 打印出缺失,提醒該參數(shù)缺失并防止錯位 sql = sql.replaceFirst('?', '缺失'); } } } } return sql; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { } }

打印結(jié)果攔截器:

import java.util.Properties; import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.MappedStatement;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.session.ResultHandler;import org.apache.ibatis.session.RowBounds; import com.poly.rbl.utils.FastJsonUtils; /** * 打印結(jié)果攔截器 〈功能詳細描述〉 * * @author gogym * @version 2019年4月2日 * @see InterceptorForQry * @since */@Intercepts({@Signature(type = Executor.class, method = 'query', args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})public class InterceptorForQry implements Interceptor{ @SuppressWarnings({'rawtypes', 'unchecked'}) public Object intercept(Invocation invocation) throws Throwable { Object result = invocation.proceed(); // 執(zhí)行請求方法,并將所得結(jié)果保存到result中 String str = FastJsonUtils.toJSONString(result); System.out.println(str); return result; } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties arg0) {}}

用法直接配置在mybatis配置文件里面即可:

<plugins> <!-- 啟動SQL打印,帶參數(shù) <plugin interceptor='com.poly.rbl.plugin.mybatis.MybatisInterceptor'> </plugin> <plugin interceptor='com.poly.rbl.plugin.mybatis.InterceptorForQry'> </plugin> </plugins>

以上這篇mybatis 通過攔截器打印完整的sql語句以及執(zhí)行結(jié)果操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

相關(guān)文章:
主站蜘蛛池模板: 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 一体化污水处理设备-一体化净水设备-「山东梦之洁水处理」 | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 游戏版号转让_游戏资质出售_游戏公司转让-【八九买卖网】 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 |