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