mybatis输出SQL格式化的方法是什么
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要讲解了"mybatis输出SQL格式化的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"mybatis输出SQL格式化的方法是什么
千家信息网最后更新 2025年01月16日mybatis输出SQL格式化的方法是什么
这篇文章主要讲解了"mybatis输出SQL格式化的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"mybatis输出SQL格式化的方法是什么"吧!
mybatis输出SQL格式化
通过第三方日志工具可以控制日志级别的输出,但是我们发现mybatis输出的SQL不是那么的完整,我们SQL里的参数值并没有打印出来,下面我就来讲讲怎么样对mybatis的输出sql格式化。
首先我这个案例是基于Spring boot 来开发的,所以配置和传统的xml配置有所区别,spring boot大大简化了一些配置,它把配置放到java代码,我们只需要使用注解就可替代一些以前xml的配置。
自定义拦截器
import java.io.PrintStream;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.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.reflection.MetaObject;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.type.TypeHandlerRegistry;import org.springframework.stereotype.Component;/** * 自定义mybatis拦截器,格式化SQL输出, * * @author zengsong * @version 1.0 * @description 只对查询和更新语句做了格式化,其它语句需要手动添加 * @date 2019/5/30 10:17 **/@Intercepts({@org.apache.ibatis.plugin.Signature(type=org.apache.ibatis.executor.Executor.class, method="update", args={MappedStatement.class, Object.class}), @org.apache.ibatis.plugin.Signature(type=org.apache.ibatis.executor.Executor.class, method="query", args={MappedStatement.class, Object.class, org.apache.ibatis.session.RowBounds.class, org.apache.ibatis.session.ResultHandler.class})})@Componentpublic class MybatisResultInterceptor implements Interceptor{ public Object intercept(Invocation invocation) throws Throwable { try { MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0]; Object parameter = null; if (invocation.getArgs().length > 1) { parameter = invocation.getArgs()[1]; } String sqlId = mappedStatement.getId(); BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); String sql = getSql(configuration, boundSql, sqlId); System.out.println(sql); } catch (Exception localException) {} return invocation.proceed(); } 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(); } 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(2, 2, 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) { Object parameterObject = boundSql.getParameterObject(); ListparameterMappings = boundSql.getParameterMappings(); String sql = boundSql.getSql().replaceAll("[\\s]+", " "); MetaObject metaObject; if ((CollectionUtils.isNotEmpty(parameterMappings)) && (parameterObject != null)) { TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject))); } else { 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)) { Object obj = boundSql.getAdditionalParameter(propertyName); sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj))); } else { sql = sql.replaceFirst("\\?", "缺失"); } } } } return sql; } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties) {}}
配置拦截器
import com.sengled.cloud.data.platform.dao.mybatis.MybatisResultInterceptor;import java.util.Properties;import javax.annotation.Resource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * 自定义mybatis拦截器 * * @author zengsong * @version 1.0 * @description * @date 2019/5/30 10:17 **/@Configurationpublic class MybatisInterceptorConfig{ @Resource private MybatisResultInterceptor mybatisResultInterceptor; @Bean public String myInterceptor() { Properties properties = new Properties(); this.mybatisResultInterceptor.setProperties(properties); return "interceptor"; }}
配置日志级别
mybatis sql语句格式化 trim prefix suffix
标题SQL语句格式化
trim标记
:是格式化sql的标记prefix
:前缀suffix
:后缀prefixOverrides
:指定去除多余的前缀内容suffixOverrides
:指定去除多余的后缀内容
1. select语句
执行结果为:
select * from tb_user where and name = #{name} andgender = #{gender}
2. insert语句
insert into tb_user id, name, gender, #{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{gender,jdbcType=BIGINT},
执行结果为:
insert into tb_user (id,name,gender) values(1,"张三",20)
3.update语句
update tb_user name = #{name} , gender = #{gender} ,
执行结果为:
update tb_user set name = "张三",gender = 30 where id = 1
感谢各位的阅读,以上就是"mybatis输出SQL格式化的方法是什么"的内容了,经过本文的学习后,相信大家对mybatis输出SQL格式化的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
格式
输出
语句
配置
方法
内容
拦截器
日志
结果
学习
前缀
后缀
标记
级别
张三
代码
传统
参数
就是
工具
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
腾讯云服务器实例怎么使用
平凉网络安全工程师视频
镇江网站服务器哪个厂家质量好
hns的服务器
东信网络技术有限公司是外包吗
网络安全法实名制解读
中小学网络技术大赛
攀枝花展厅互动软件开发
微信的软件开发模型是哪种
海关 大数据 网络安全 论文
时钟同步服务器启动失败
数据库分配的用户无法创建视图
服务器有域管理
怎么保证服务器运行24小时
河北管理系统软件开发
出行数据库源代码
数据库数据模型是依赖
省市县三级联动数据库设计
怎么切换刺激战场服务器
美国机载软件开发
表示表的数据的数据库对象
网络技术与应用学校
电信十区服务器在哪
黄石网络安全方案
sql数据库开通1433
材料基因大数据库
服务器漏洞修复记录
数据库系统是由什么组成
省市县三级联动数据库设计
人工智能探索网络安全