【问题标题】:Can MyBatis log the complete SQL that can run directlyMyBatis 是否可以记录完整的可以直接运行的 SQL
【发布时间】:2018-11-01 06:45:01
【问题描述】:

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

【问题讨论】:

    标签: mysql sql logging mybatis


    【解决方案1】:

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

    如果查询有参数,mybatis 原则上也不能这样。为了记录查询,所有参数都应该被序列化并表示为字符串。对于像StringInteger 这样的简单数据类型,这不是问题,但对于像TimestampBlob 这样的更复杂的表示可能取决于数据库。

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

    所以最好的方法(以及 mybatis 中的 is supported)是使用单独使用的占位符和日志参数记录查询。为以映射器命名的记录器配置DEBUG 日志级别。

    log4j 配置如下:

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

    【讨论】:

      【解决方案2】:

      如果你在开发环境中使用IntelliJ,我认为插件Mybatis Log Plugin可以帮助你。

      而且如果是生产环境,可以把日志复制粘贴到本地。然后使用插件功能Restore Sql from SelectionRestore Sql from text(新版本即将推出)

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-01
          • 1970-01-01
          • 2017-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多