专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Mybatis拦截器实现带参数SQL语句打印

  前言
  在我们工作实际项目中,常常遇到使用Mybatis作为ORM框架,在使用的过程中,一般都会开启日志的打印功能,这样在控制台就会输出执行的SQL,定位SQL问题也是比较方便的。但是,我们就会发现,这样打印出来的SQL是预编译语句和参数是分开的。
  此时如果需要去数据库执行上条SQL的时候,我们需要手动的把参数拼接到SQL语句中;参数少此操作还可以,参数一旦比较多,此操作相当的麻烦繁琐。下面我们就使用Mybatis拦截器的方式来实现打印完整SQL的功能。具体实现实现拦截器逻辑importlombok。extern。slf4j。Slf4j;importorg。apache。ibatis。cache。CacheKey;importorg。apache。ibatis。executor。Executor;importorg。apache。ibatis。mapping。BoundSql;importorg。apache。ibatis。mapping。MappedStatement;importorg。apache。ibatis。mapping。ParameterMapping;importorg。apache。ibatis。plugin。;importorg。apache。ibatis。reflection。MetaObject;importorg。apache。ibatis。session。Configuration;importorg。apache。ibatis。session。ResultHandler;importorg。apache。ibatis。session。RowBounds;importorg。apache。ibatis。type。TypeHandlerRegistry;importorg。springframework。util。CollectionUtils;importjava。text。DateFormat;importjava。util。Date;importjava。util。List;importjava。util。Locale;importjava。util。Properties;importjava。util。regex。Matcher;author公众号:SimpleMemoryversion1。0。0ClassNameFullSQLInterceptor。javaDescriptionTODOcreateTime2022年10月14日18:39:00Slf4jIntercepts(value{Signature(typeExecutor。class,methodupdate,args{MappedStatement。class,Object。class}),Signature(typeExecutor。class,methodquery,args{MappedStatement。class,Object。class,RowBounds。class,ResultHandler。class,CacheKey。class,BoundSql。class}),Signature(typeExecutor。class,methodquery,args{MappedStatement。class,Object。class,RowBounds。class,ResultHandler。class})})publicclassMybatisSQLInterceptorimplementsInterceptor{OverridepublicObjectintercept(Invocationinvocation)throwsThrowable{try{获取xml中的一个selectupdateinsertdelete节点,主要描述的是一条SQL语句MappedStatementmappedStatement(MappedStatement)invocation。getArgs()〔0〕;Objectparameternull;获取参数,if语句成立,表示sql语句有参数,参数格式是map形式if(invocation。getArgs()。length1){parameterinvocation。getArgs()〔1〕;log。error(sqlparam:{},parameter);}if(SqlCommandType。SELECT。equals(mappedStatement。getSqlCommandType())){}获取到节点的id,即sql语句的idStringsqlIdmappedStatement。getId();BoundSql就是封装myBatis最终产生的sql类BoundSqlboundSqlmappedStatement。getBoundSql(parameter);获取节点的配置ConfigurationconfigurationmappedStatement。getConfiguration();获取到最终的sql语句StringsqlgetSql(configuration,boundSql,sqlId);log。error(sql{},sql);}catch(Exceptione){}执行完上面的任务后,不改变原有的sql执行过程returninvocation。proceed();}封装了一下sql语句,使得结果返回完整xml路径下的sql语句节点idsql语句paramconfigurationconfigurationparamboundSqlboundSqlparamsqlIdsqlIdreturnjava。lang。StringpublicstaticStringgetSql(Configurationconfiguration,BoundSqlboundSql,StringsqlId){StringsqlshowSql(configuration,boundSql);StringBuilderstrnewStringBuilder(100);str。append(sqlId);str。append(:);str。append(sql);returnstr。toString();}如果参数是String,则添加单引号,如果是日期,则转换为时间格式器并加单引号;对参数是null和不是null的情况作了处理paramobjobjreturnjava。lang。StringprivatestaticStringgetParameterValue(Objectobj){Stringvaluenull;if(objinstanceofString){valueobj。toString();}elseif(objinstanceofDate){DateFormatformatterDateFormat。getDateTimeInstance(DateFormat。DEFAULT,DateFormat。DEFAULT,Locale。CHINA);valueformatter。format(newDate());}else{if(obj!null){valueobj。toString();}else{value;}}returnvalue;}进行?的替换paramconfigurationparamboundSqlreturnpublicstaticStringshowSql(Configurationconfiguration,BoundSqlboundSql){ObjectparameterObjectboundSql。getParameterObject();获取参数ListParameterMappingparameterMappingsboundSql。getParameterMappings();StringsqlboundSql。getSql()。replaceAll(〔s〕,);sql语句中多个空格都用一个空格代替if(!CollectionUtils。isEmpty(parameterMappings)parameterObject!null){TypeHandlerRegistrytypeHandlerRegistryconfiguration。getTypeHandlerRegistry();获取类型处理器注册器,类型处理器的功能是进行java类型和数据库类型的转换
  如果根据parameterObject。getClass()可以找到对应的类型,则替换if(typeHandlerRegistry。hasTypeHandler(parameterObject。getClass())){sqlsql。replaceFirst(?,Matcher。quoteReplacement(getParameterValue(parameterObject)));}else{MetaObjectmetaObjectconfiguration。newMetaObject(parameterObject);MetaObject主要是封装了originalObject对象,提供了get和set的方法用于获取和设置originalObject的属性值,主要支持对JavaBean、Collection、Map三种类型对象的操作for(ParameterMappingparameterMapping:parameterMappings){StringpropertyNameparameterMapping。getProperty();if(metaObject。hasGetter(propertyName)){ObjectobjmetaObject。getValue(propertyName);sqlsql。replaceFirst(?,Matcher。quoteReplacement(getParameterValue(obj)));}elseif(boundSql。hasAdditionalParameter(propertyName)){ObjectobjboundSql。getAdditionalParameter(propertyName);该分支是动态sqlsqlsql。replaceFirst(?,Matcher。quoteReplacement(getParameterValue(obj)));}else{sqlsql。replaceFirst(?,缺失);}打印出缺失,提醒该参数缺失并防止错位}}}returnsql;}OverridepublicObjectplugin(Objecttarget){returnPlugin。wrap(target,this);}OverridepublicvoidsetProperties(Propertiesproperties){}}
  配置拦截器
  在Mybatis的配置文件中配置拦截器
  pluginsplugininterceptorcom。ruoyi。web。config。MybatisSQLInterceptorpluginplugins
  在application。yml中配置Mybatis的全局的配置文件mybatisconfig。xml
  实现效果
  启动项目,查看控制台打印SQL语句情况。
  2022101509:51:50。780ERROR30292〔io8089exec24〕c。r。web。config。MybatisSQLInterceptor:sqlcom。ruoyi。system。mapper。SysDeptMapper。selectDeptList:selectd。deptid,d。parentid,d。ancestors,d。deptname,d。ordernum,d。leader,d。phone,d。email,d。status,d。delflag,d。createby,d。createtimefromsysdeptdwhered。delflag0ANDdeptnamelikeconcat(,开发,)ANDstatus0orderbyd。parentid,d。ordernum
  公众号:SimpleMemory

最近想换个手机,1000到2000元左右,续航好颜值高充电快的手机有哪些?题主想要10002000元之间的长续航和拍照好的手机,这个价位买到的就是安卓中端手机,甚至会偏低端一些的手机。小编今天就给大家推荐几款这样的手机。第一款红米K30在我看来,最符合题要想上警校的话需要高考考多少分?警校分为两种,一种是提前批的,分数需要达到一本分数线以上,不过也有二本的院校,但是分数绝对不会低。另一种是普通批次的警校,一般都是高职高专。这两种警校的有什么区别呢?提前批。提前批尿酸在420480之间长达6年,有什么危害?近年来,痛风的患病率呈明显的逐年上升的趋势,并且还存在时间地域种族年龄和性别上的差异。既往认为长期持续的尿酸居高不下,尤其是45岁以上的男性容易患痛风现在对于痛风的认识已经发生变化一个有500亿现金,一个市值有5000亿,到底哪个有钱?你这个问题有点考验人性。一个是现金500亿,一个是市值5000亿,到底哪一个更有钱?你问的是这二者到底哪一个更有钱,从这个角度看,毫无疑问,当然是拥有5000亿市值的人更有钱。为什右上腹疼痛是什么原因?如何应对?在我看诊过的患者中,无论是急性还是慢性肝炎,或者是肝硬化和肝癌,都经常会有右上腹痛的情况。他们的右上腹痛,有时并不单单是肝脏的原因,还可能是胆,或者十二指肠食道肠道,甚至是由肺胸膜现在中考越来越难,每年没有考上高中的学生都是什么原因造成的?再过两个多月一年一度的中考就要到来了,每年中考过后都会有很多初中生没能考入高中,那么都是因为什么原因造成这些孩子没有考上高中呢?接下来就这个问题进行详细的阐述,同时也在这里告诫每一孩子写作业磨蹭,是什么原因?小孩写作业很慢的原因有三一是写字的熟练程度,影响写作业的速度二是小孩对知识的掌握程度,需思考答案三是小孩的性格,习惯,可能写作业时还做其他事情。要想提高写作业的速度,应从这三方面入靶向药,可以停药吗?作为一乡镇卫生院的小医生我就和你讲讲我的小见闻吧,我收了一个老年肺癌患者本来他一直在吃了半年靶向药物,复查ct癌块无明显生长,然后老爷子嫌弃药物副作用大吃了浑身无力,自行停药半个月网上被诈骗报案后成功取回的几率有多大?之前看了资料的,大部分诈骗犯在境外,很多也是被境外组织控制犯罪的。很多人被骗过去,然后在那些非法组织的犯罪团伙控制下,按照既定的剧本寻找目标。比如杀猪盘,他们往往是很多人去分析受害马桶买什么好?国内的我建议买恒洁和惠达(唐山),恒洁节水,惠达性价比较高,冲得也很干净!我买的就是惠达。如果还要买得更好点的话,当然是TOTO和科勒了,这两个很有特色。TOTO很厉害了,有一项虹农村有一种叫刺蓟草,它有哪些功效和作用呢?农村有一种叫刺薊草,它有哪些功效和作用呢?说起刺薊草相信会有很多人不太知道它是什么,但要叫它小名刺菜或是七七菜止血菜,这在农村是无人不知无人不晓得。刺菜是农村最常见的一种野菜,在我
人到中年最好的修行强者不争,慧者不露!著名作家余秋雨说过人的生命格局一大,就不会在琐碎妆饰上沉陷。人生,不过就是一场修行,生活之所以充满痛苦,只因自身格局不大。强大的人,不一定都会成功,但成功的人,一定有大格局。真正厉iOS16不好用?那就跟着我降级到iOS15。7。1众所周知,iOS系统的升级一般都是没有后悔药可以吃的,但是这段时间升级了iOS16以上系统的,如果觉得不好用,我们可以降级到iOS15。7。1,下面就跟着我操作吧,。注意iPhon沉默沉默意味着什么?在最后审判的那天,一群人被上帝问到这个必答题。农民说顺从年长者说怜悯。慕僚说同意。预言家说等待。男人说旁观。女人说承担。学者说蔑视。诗人说隐瞒。哲学家说大智。后来上美女图集第二十二期。。。。。。42岁刘涛穿衣变大胆,高开衩裙秀大白腿,高颧骨美女真有旺夫相年过40岁的女人,有了丰富的生活阅历并且经过岁月的沉淀,身上总是会散发出一股成熟的气质,而这种所谓年龄感,其实还有助于塑造成熟女人味造型。像42岁的演员刘涛身穿高开衩裙秀大白腿,不红色记忆半夜来客作者张伯生来源乐亭文化研究会题图来自网络,仅为配图,和本文无关1944年春末的一天夜里12点多钟,我同母亲在东屋正在熟睡中,突然被房顶上的行人走动而惊醒。急忙坐了起来。母亲小声对我睡前坚持用艾叶泡脚,一段时间后,或许能帮你解决这7个问题艾叶在很多人眼里可谓是神通广大,也可谓文武双全,文能吃,武除病!艾叶在某些地方还被用于驱邪,艾叶还是深受很多人喜爱的物品,因为它能够帮助人们实现很多的保健作用。随着当今养生理念的逐武汉理工大学牵头获批国家自然科学基金重大项目近日,国家自然科学基金委公布了2022年国家自然科学基金重大项目评审结果,武汉理工大学牵头承担的国家自然科学基金重大项目孔材料催化的过程耦合与机制获立项资助,这是学校科技创新能力提一月电视市场报告出炉,TCL成为唯一增长品牌,海信等品牌均下滑当大家还沉浸在彩电市场能够在2023迎来复苏行情的美好期望中时,1月电视市场报告出炉的成绩单,却给了市场当头一棒开年并不红,当月中国电视市场品牌整机出货量为337万台,同比下降16负距离接触身体承担快乐,一切沉重都被屏蔽夜已深沉,凌晨2点左右,小文从睡梦中醒来时,嘴角的肌肉不自觉地微翘,感受着被窝里的温暖。窗帘外透进来稀薄的光,将漆黑的夜色调成了渐变的墨绿色。大脑里的多巴胺奖励着她此刻的感觉宁静的早餐吃水煮蛋对身体好?专家提醒4项禁忌须远离早餐是一天中最重要的一餐,它可以为身体提供所需的营养和能量,帮助人们保持健康的身体和敏捷的思维。而水煮蛋作为一种低脂肪高蛋白质的食品,也成为了许多人早餐的选择之一。那么,每天早上吃
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网