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

时间:2018-11-01 06:45:02

标签: mysql sql logging mybatis

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

3 个答案:

答案 0 :(得分:1)

通常情况下,答案是否定的。

如果查询具有参数,mybatis即使在原则上也无法做到这一点。为了记录查询,所有参数应序列化并表示为字符串。对于StringInteger这样的简单数据类型来说,这不是问题,但对于TimestampBlob这样的更复杂的数据类型,表示可能取决于数据库。

执行查询时,无需将参数转换为字符串,因为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 SelectionRestore Sql from text(即将推出新版本)

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

答案 2 :(得分:0)

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

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