2

我们大量使用 iBatis + Spring。我们从数据库中获得的一切都是通过存储过程获取的。有时在对问题进行故障排除时,我们想知道发送到 SP 的确切参数和执行的 SP 名称。目前我们通过调试代码来做到这一点(这很痛苦)。我们想向 iBatis 添加某种日志记录,以便打印出 SP + 参数值的名称。我们使用 log4j,下面是我们的 iBatis 结构。

映射:

<procedure id="getReportData" parameterMap="getReportDataCall">
   {call get_rpt (?,?,?,?)}
</procedure>

  <parameterMap id="getReportDataCall" class="map">
    <parameter property="type" jdbcType="String" javaType="java.lang.String" mode="IN"/>
    <parameter property="month" jdbcType="Int" javaType="java.lang.Integer" mode="IN"/>
    <parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="result1"/>
    <parameter property="Result1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="result2"/>
  </parameterMap>

  <resultMap id="select-first-result-hq" class="VO">
    <result property="column1" column="columna"/>
    <result property="column2" column="columnb"/>
  </resultMap

从 DAO 调用 iBatis

HashMap parm = new HashMap ();
parm.put("type", type_val);
parm.put("month", month_val);
getSqlMapClientTemplate().queryForList("mymappingName.getReportData", parm);

如您所见,参数只是在一个HashMap. 我可以创建一个自己的类+方法,它将HashMap过程名称和过程名称作为参数,并将哈希图的所有键/值对和过程名称打印到日志中。但是,如果我这样做......我必须在调用 SP 之前将该调用添加到我所有的 DAO 中。

有没有更简单的解决方案?那会避免我再次触摸我的所有代码吗?

4

1 回答 1

0

我也非常广泛地使用了 iBatis 和 Spring,通常只是将 java.sql.* 类的日志记录级别提高到 DEBUG。我通常在 log4j.properties 中做这样的事情:

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

这会记录传递给参数占位符的 sql 和值。

于 2010-03-07T00:21:01.917 回答