我想在spring JdbcTemplate
中使用scala的隐式转换。
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)
在jdbcTemplate
和RichJdbcTemplate
之间会有隐式转换。但实际上它并没有在这里进行隐式转换。因为这里的方法符合jdbcTemplate.update(String sql, Object... params)
的签名。这就是为什么这里没有隐式转换的原因。有没有其他解决方案可以实现这一目标?感谢。
答案 0 :(得分:4)
只需给你的方法一个不同的名字;称之为updateWithFunction
或其他什么。
正如您所提到的,问题是Scala不会寻找隐式转换,因为它会在JdbcTemplate
上直接找到具有正确名称和正确参数类型的方法。解决这个问题的方法是使用不会<{1}} 找到的名称。
您也可以明确地进行换行,JdbcTemplate
,但那更加丑陋。
答案 1 :(得分:3)
将更新方法重命名为其他方法。在对象中定义隐式转换并导入范围:
object MyImplConversions {
implicit def toRichJdbcTemplate(jdbcTemplate: JdbcTemplate) =
new RichJdbcTemplate(jdbcTemplate)
}