Myabtis如何在Java中打印Debug日志
Mybatis的Bug定位
Mybatis的Bug定位
我们的CURD开发中,会遇到SQL没有按照我们预想的情况执行的BUG,但是SQL又是Mybatis动态生成的,难以确定问题所在。
有几种常见的调试方式:
- 直接在Mybatis里上断点,特别是在org.apache.ibatis.mapping.BoundSql类的getSql()方法,直接能拿到SQL,如果想要观测特定的SQL,可以使用条件断点,
sql.contains("xxx关键字")
- 如果不好下断点,可以使用Arthas去观测,可以观测org.apache.ibatis.session.Configuration 类的 newParameterHandler()方法;为什么要观测这个方法,因为这个方法的参数
ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql)
集齐了3个必备参数:参数1这个语句的坐标基本信息;参数2基本的SQL入参;参数3:解析后的SQL基本结构体 - 直接打开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都可以解析、检索、展示。