MyBatis可以记录可以直接运行的完整SQL吗
一般情况下答案是否定的。
如果查询有参数,mybatis 原则上也不能这样做。为了记录查询,所有参数都应该序列化并表示为字符串。对于
String
或 Integer
等简单数据类型,这不是问题,但对于 Timestamp
或 Blob
等更复杂的数据类型,表示可能取决于数据库。
执行查询时,无需将参数转换为字符串,因为 JDBC 驱动程序以更有效(且依赖于数据库)的格式将它们传递到数据库。但出于日志记录的目的,mybatis 只有 java 对象,并且 mybatis 不知道如何将它们表示为数据库特定的字符串文字。
因此,您可以拥有的最好的方法(mybatis 中支持)是使用占位符和单独使用的日志参数来记录查询。为以映射器命名的记录器配置
DEBUG
日志级别。
对于 log4j 配置如下所示:
log4j.logger.my.org.myapp.SomeMapper=DEBUG
如果你在开发环境中并使用IntelliJ,我认为插件
Mybatis Log Plugin
可以帮助你。
而且如果是生产环境,可以将日志复制粘贴到本地。然后使用插件功能
Restore Sql from Selection
或Restore Sql from text
(新版本即将推出)
您可以将
com.mysql.cj.jdbc.PreparedStatement
复制到您的项目目录(保持相同的包路径)并在log.info(asSql())
之后调用PreparedStatement.execute.fillSendPacket
方法。 (使用批处理操作时,您可以使用executeBatchInternal)。
类将从您的项目中加载,并且原始类将被忽略,您可以在其他框架和数据库上尝试此操作。
这个网站可能对您有帮助。 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