1

我想在 spring 中使用 scala 的隐式转换JdbcTemplate

JdbcTemplate有以下两种方法:

jdbcTemplate.update(String sql, Object... params)               // (1)

jdbcTemplate.update(String sql, PreparedStatementSetter pss)    // (2)

PreparedStatementSetter只是一个接口,我只想将一个函数值传递给JdbcTemplate. 这意味着我想将其更改为

JdbcTemplate.update(sql: String, setter: PreparedStatement => Unit) // (3)

我所做的是创建RichJdbcTemplate,作为包装JdbcTemplate

class RichJdbcTemplate(jdbcTemplate: JdbcTemplate) {

  def update(sql: String, setter: PreparedStatement => Unit) {
    jdbcTemplate.update(sql, new PreparedStatementSetter() {
      def setValues(ps: PreparedStatement) {
        setter(ps)
      }
    })
  }
}

而且我希望每次调用jdbcTemplate.update(sql, setter: PreparedStatement => Unit) 时都会在jdbcTemplateand之间进行隐式转换RichJdbcTemplate。但实际上它并没有在这里进行隐式转换。因为这里的方法符合jdbcTemplate.update(String sql, Object... params). 这就是为什么这里没有隐式转换的原因。有没有其他解决方案可以实现这一目标?谢谢。

4

2 回答 2

4

只需给您的方法起一个不同的名称即可;叫它updateWithFunction什么的。

正如您所提到的,问题在于 Scala 不寻找隐式转换,因为它直接在JdbcTemplate. 绕过它的方法是使用在 . 上找不到JdbcTemplate名称。

您也可以显式地进行包装new RichJdbcTemplate(jdbcTemplate).update(...),但这更难看。

于 2012-12-05T03:23:26.643 回答
3

将更新方法重命名为其他名称。在对象中定义隐式转换并导入范围:

object MyImplConversions {
  implicit def toRichJdbcTemplate(jdbcTemplate: JdbcTemplate) =
    new RichJdbcTemplate(jdbcTemplate)
}
于 2012-12-05T04:47:08.220 回答