【发布时间】:2018-11-01 06:45:01
【问题描述】:
MyBatis 能否记录完整的可以直接运行的SQL
【问题讨论】:
MyBatis 能否记录完整的可以直接运行的SQL
【问题讨论】:
一般情况下答案是否定的。
如果查询有参数,mybatis 原则上也不能这样。为了记录查询,所有参数都应该被序列化并表示为字符串。对于像String 或Integer 这样的简单数据类型,这不是问题,但对于像Timestamp 或Blob 这样的更复杂的表示可能取决于数据库。
执行查询时,无需将参数转换为字符串,因为 JDBC 驱动程序以更高效(并且依赖于数据库)的格式将它们传递给数据库。但是出于日志记录的目的,mybatis 只有 java 对象,而 mybatis 不知道如何将它们表示为数据库特定的字符串文字。
所以最好的方法(以及 mybatis 中的 is supported)是使用单独使用的占位符和日志参数记录查询。为以映射器命名的记录器配置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复制到您的项目目录(保持相同的包路径)并在PreparedStatement.execute.fillSendPacket之后调用log.info(asSql())方法。 (在使用批处理操作时,您可以使用 executeBatchInternal)。
类将从您的项目中加载,源类将被忽略,您可以在其他框架和数据库上尝试。
【讨论】: