MyBatis 拦截器中绑定参数的访问

Access to Bind Parameters in MyBatis Interceptor

如何读取 MyBatis 拦截器中的绑定参数?我正在尝试提取这些信息,以便将它们写入日志 table.

指南(http://www.mybatis.org/mybatis-3/configuration.html) didn't mention how to get them, and the JavaDoc (http://www.mybatis.org/mybatis-3/es/apidocs/org/apache/ibatis/mapping/BoundSql.html)没有一行评论。我在 SO 上看到了一个关于构建新 BoundSql 的示例,但这不是我需要的。

我尝试测试了BoundSql.getParameterMappings()和BoundSql.getParameterObject()中存储了哪些内容,但它似乎相当复杂。有 JavaType 和 JdbcType,如果只有一个参数,ParameterObject 就不是 Map 对象。

从 BoundSql 获取绑定参数的正确方法是什么?

翻了MyBatis的源码(注释是濒危物种),才知道MyBatis是如何处理bind参数的。但是,这需要访问 JDBC 语句对象,这在拦截器中根本不可用。

然后我做了一些测试并确定了这个:

  1. 如果只有一个参数,BindSql.getParameterObject() 会给你参数本身。通过使用 BindSql.getParameterMappings() 和 ParameterMapping.getJavaType() 我可以知道参数是哪个 Java class。

  2. 如果有多个参数,BindSql.getParameterObject()会return一个org.apache.ibatis.binding.MapperMethod.ParamMap的实例,它扩展了HashMap,否则就是一个实例您使用的 DTO。使用 ParameterMapping 中的 .getProperty() 作为键或作为 getter 名称,您可以一个一个地处理绑定参数。

如果有人有更好的方法,我会洗耳恭听。