MyBatis可以记录可以直接运行的完整SQL吗

问题描述 投票:0回答:4

MyBatis可以记录可以直接运行的完整SQL吗

mysql sql logging mybatis
4个回答
1
投票

一般情况下答案是否定的。

如果查询有参数,mybatis 原则上也不能这样做。为了记录查询,所有参数都应该序列化并表示为字符串。对于

String
Integer
等简单数据类型,这不是问题,但对于
Timestamp
Blob
等更复杂的数据类型,表示可能取决于数据库。

执行查询时,无需将参数转换为字符串,因为 JDBC 驱动程序以更有效(且依赖于数据库)的格式将它们传递到数据库。但出于日志记录的目的,mybatis 只有 java 对象,并且 mybatis 不知道如何将它们表示为数据库特定的字符串文字。

因此,您可以拥有的最好的方法(mybatis 中支持)是使用占位符和单独使用的日志参数来记录查询。为以映射器命名的记录器配置

DEBUG
日志级别。

对于 log4j 配置如下所示:

log4j.logger.my.org.myapp.SomeMapper=DEBUG

0
投票

如果你在开发环境中并使用IntelliJ,我认为插件

Mybatis Log Plugin
可以帮助你。

而且如果是生产环境,可以将日志复制粘贴到本地。然后使用插件功能

Restore Sql from Selection
Restore Sql from text
(新版本即将推出)

详细介绍:
https://github.com/kookob/mybatis-log-plugin


0
投票

您可以将

com.mysql.cj.jdbc.PreparedStatement
复制到您的项目目录(保持相同的包路径)并在
log.info(asSql())
之后调用
PreparedStatement.execute.fillSendPacket
方法。 (使用批处理操作时,您可以使用executeBatchInternal)。

类将从您的项目中加载,并且原始类将被忽略,您可以在其他框架和数据库上尝试此操作。


0
投票

这个网站可能对您有帮助。 https://replacesomething.com/ 例如

sql:

select * from table where a = ? and b = ? and c = ? and d = ?

参数:

a(String),1(Integer),2020-01-01(Timestamp),8.88(BigDecimal)

那么本站可以将那些问号替换为相应的参数

结果:

select
  *
from
table
where
  a = 'a'
  and b = 1
  and c = '2020-01-01'
  and d = 8.88
© www.soinside.com 2019 - 2024. All rights reserved.