广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis输出SQL格式化方式
  • 439
分享到

mybatis输出SQL格式化方式

2024-04-02 19:04:59 439人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis输出sql格式化自定义拦截器配置拦截器配置日志级别mybatis sql语句格式化 trim prefix suffix1. select语句2. ins

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;

@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})})
@Component
public 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();
        List<ParameterMapping> parameterMappings = 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;

@Configuration
public class MybatisInterceptorConfig
{
    @Resource
    private MybatisResultInterceptor mybatisResultInterceptor;
    @Bean
    public String myInterceptor()
    {
        Properties properties = new Properties();
        this.mybatisResultInterceptor.setProperties(properties);
        return "interceptor";
    }
}

配置日志级别


 <logger name="com.apache.ibatis" level="TRACE"/>
 <logger name="java.sql.Connection" level="DEBUG"/>
 <logger name="java.sql.Statement" level="DEBUG"/>
 <logger name="java.sql.PreparedStatement" level="DEBUG"/>
 <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
 </root>

mybatis sql语句格式化 trim prefix suffix

标题SQL语句格式化

  • trim标记:是格式化sql的标记
  • prefix:前缀
  • suffix:后缀
  • prefixOverrides:指定去除多余的前缀内容
  • suffixOverrides:指定去除多余的后缀内容

1. select语句


<select id="" parameterType="" resultType="">
 select * from tb_user
 <trim perfis="WHERE" prefixOverrides = "AND | OR">
  <if test="name != null"> AND name = #{name}</if>
  <if test="gender != null"> AND gender= #{gender}</if>
 </trim>
</select>

执行结果为:

select * from tb_user where and name = #{name} andgender = #{gender}

2. insert语句


<insert id="" parameterType="">
    insert into tb_user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="name!= null">
        name,
      </if>
      <if test="gender!= null">
        gender,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="name!= null">
        #{name,jdbcType=VARCHAR},
      </if>
     <if test="gender!= null">
        #{gender,jdbcType=BIGINT},
      </if>
    </trim>
  </insert>

执行结果为:

insert into tb_user (id,name,gender) values(1,“张三”,20)

3.update语句


  <update id="">
    update tb_user
     <trim prefix="set" suffix=" where id = #{id}" suffixOverrides="," >
     <if test="name != null"> name = #{name} , </if>
     <if test="gender != null"> gender = #{gender} ,</if>
    </trim>
  </update>

执行结果为:

update tb_user set name = “张三”,gender = 30 where id = 1

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: mybatis输出SQL格式化方式

本文链接: https://www.lsjlt.com/news/158561.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis输出SQL格式化方式
    目录mybatis输出SQL格式化自定义拦截器配置拦截器配置日志级别mybatis sql语句格式化 trim prefix suffix1. select语句2. ins...
    99+
    2022-11-12
  • mybatis输出SQL格式化的方法是什么
    这篇文章主要讲解了“mybatis输出SQL格式化的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mybatis输出SQL格式化的方法是什么”吧!mybatis输出SQL格式化通过...
    99+
    2023-06-21
  • 格式化输出
    目录 占位符(掌握) format格式化(了解) f-String格式化(掌握) 程序中经常会有这样场景:要求用户输入信...
    99+
    2023-01-31
  • Pythonformat()格式化输出方法
    自 Python 2.6 版本开始,字符串类型(str)提供了 format() 方法对字符串进行格式化,本节就来学习此方法。 format() 方法的语法格式如下: str....
    99+
    2022-11-12
  • SQL Plus输出结果的格式化(linesize、pagesize)
    描述:SQL Plus可以执行数据库的一些操作,就像使用其他数据库工具一样,但是SQL Plus有一个缺点就是输出结果的格式化不尽人意。      ...
    99+
    2022-10-18
  • python中的格式化输出方法
    目录1 使用字符串模运算符(%)格式化输出2 使用 format 方法格式化输出​3 使用 String 方法格式化输出前言: 有几种方法可以显示程序的输出。 数据可以以人类可读的形...
    99+
    2022-11-13
  • pythn print格式化输出----
    pythn print格式化输出。   %r 用来做 debug 比较好,因为它会显示变量的原始数据(raw data),而其它的符号则是用来向用户显示输出的。   1. 打印字符串 print ("His name is %s"%("A...
    99+
    2023-01-30
    pythn print
  • python3 format格式化输出
    使用 format 方法,可以很方便的对字符串进行格式化输出 1. 使用参数位置格式 'my name is {0}, {0} age is {1}'.format('wang',10) >>> 'my name is ...
    99+
    2023-01-31
    format
  • Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
    依赖 <dependency> <groupId>log4j</groupId> <a...
    99+
    2022-11-12
  • C++的输入与输出和格式化输出
    目录一、C++ 输入与输出 格式化输出1.cin与cout2.格式化输出2.1设置域宽及位数2.2按进制输出2.3设置填充符总结一、C++ 输入与输出 格式化输出 1.cin与cou...
    99+
    2022-11-12
  • python格式化输出方法是什么
    本篇内容介绍了“python格式化输出方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!#初级版本的格式化输出name =&...
    99+
    2023-06-02
  • Python学习 :格式化输出
    方式一:使用占位符 %   常用占位符:% s   (s = string 字符串)          % d   (d = digit 整数(十进制))        %  f   ( f = float  浮点数)   name =...
    99+
    2023-01-30
    Python
  • Python格式化输出详情
    目录1.%格式化1.1简单格式化,不使用可选参数1.2 复杂格式化,使用可选参数1.2.1参数 (name),用于选择指定的key1.2.2参数flags和width,对齐方式和宽度...
    99+
    2022-11-12
  • Python格式化输出总结
    格式化输出一,使用%占位符name = input("请输入您的姓名") age = int(input("请输入您的年龄")) job = input("请输入您的工作") hobby = input("请输入您的爱好") msg = '...
    99+
    2023-01-31
    Python
  • Python【3】:格式化 输出 whi
    (占位符) % (求余数) 示例 name = input("请输入你的名字") age =int(input("请输入你的年龄")) ...
    99+
    2023-01-31
    Python whi
  • Java BigDecimal除法精度和格式化输出方式
    目录BigDecimal除法精度和格式化输出答案BigDecimal的用法详解保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理构造器描述方法描述常用方法BigD...
    99+
    2022-11-12
  • PHP输出JSON格式数据方式
    目录PHP输出JSON格式数据PHP直接输出JSON数据总结PHP输出JSON格式数据 常用框架封装好的方法来输出JSON数据,但是手动去书写的时候却遇到了问题,因为输出的数据类型为...
    99+
    2023-02-18
    PHP输出JSON格式 PHP输出JSON数据 PHP输出数据
  • Java格式化输出的方法有哪些
    这篇文章主要讲解了“Java格式化输出的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java格式化输出的方法有哪些”吧!Java控制台输出1.使用System.out.write...
    99+
    2023-07-05
  • C++ stringstream格式化输出输入分析
    这篇文章主要讲解了“C++ stringstream格式化输出输入分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++ stringstream格式化输出输入分析”吧!目录最近在笔试时经...
    99+
    2023-06-25
  • C++ stringstream格式化输出输入详情
    目录最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作