Mybatis的Debug日志的在线解析

Mybatis的Debug日志的在线解析

我们的CURD开发中,会遇到SQL没有按照我们预想的情况执行的BUG,但是SQL又是Mybatis动态生成的,难以确定问题所在。

有几种常见的调试方式:

  1. 直接在Mybatis里上断点,特别是在org.apache.ibatis.mapping.BoundSql类的getSql()方法,直接能拿到SQL,如果想要观测特定的SQL,可以使用条件断点,sql.contains("xxx关键字")
  2. 如果不好下断点,可以使用Arthas去观测,可以观测org.apache.ibatis.session.Configuration 类的 newParameterHandler()方法;为什么要观测这个方法,因为这个方法的参数ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) 集齐了3个必备参数:参数1这个语句的坐标基本信息;参数2基本的SQL入参;参数3:解析后的SQL基本结构体
  3. 直接打开Mybatis的DEBUG日志,专门让Mybatis打印每一条执行的SQL语句的基本信息;这里取决于您使用的日志系统。

调试方式2,CtBots.com 有工具🚀开始Arthas日志分析

调试方式3,CtBots.com 有工具🔧开始Mybatis的log日志分析

调试方式3-Mybatis的调试日志介绍

mybatis的 BaseJdbcLogger 类负责打印具体的日志,分别有4个子类:

  • StatementLogger 【普通sql执行,要关注的目标】
  • ConnectionLogger 【数据库连接信息】
  • ResultSetLogger 【数据库返回家结果集】
  • PreparedStatementLogger 【预编译sql执行,要关注的目标】

BaseJdbcLogger 的 prefix 方法展示了核心输出方式

  private String prefix(boolean isInput) {
    char[] buffer = new char[queryStack * 2 + 2];
    Arrays.fill(buffer, '=');
    buffer[queryStack * 2 + 1] = ' ';
    if (isInput) {
      buffer[queryStack * 2] = '>';
    } else {
      buffer[0] = '<';
    }
    return new String(buffer);
  }

==> 表示输出 <== 表示输入; == 的数量表示嵌套层级; ====> 表示第2层输出;<==== 表示第2层输入

Mybatis是允许查询嵌套的,例如【在定义一个结果集事,可以通过级联的方式,自动嵌套获取另外一个对象】:

<resultMap id="PersonResultMap" type="map">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="age" column="age"/>
	<result property="email" column="email"/>
	<result property="manager_id" column="manager_id"/>
	<association property="manager" column="manager_id" select="getById"/>
</resultMap>

调试方式3-Mybatis如何打开Debug日志

实际上,这里主要取决于当前项目给Mybatis配置的日志系统

如果您是在yml文件中配置,大概会有类似的配置:

mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j2.Log4j2Impl

实际上,您可以直接配置的标准输出,或者slf4j

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

如果您配置的Log4j2,那么就需要关注Log4j2的配置文件,或者直接在代码中配置,我们这里配置Mybatis的DEBUG日志输出到控制台

<Appenders>
	<Console name="Console" target="SYSTEM_OUT">
		<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
	</Console>
</Appenders>
<Loggers>
	<Logger name="org.apache.ibatis" level="debug" additivity="false">
		<AppenderRef ref="Console"/>
	</Logger>
</Loggers>

其他的日志系统,需要您自行配置,或者咨询大模型

不管是纯Mybatis的DEBUG日志,还是混合有Java的其他日志,CtBots.com都可以解析、检索、展示。

🔧快来试试吧,Mybaits日志在线解析

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值