我只是在学习Scala,并尝试用Spring创建不同的场景。
以下代码执行得很完美:
def insert(student: Student): Unit = {
jdbcTemplate.update("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
new PreparedStatementSetter() {
def setValues(ps: PreparedStatement) {
ps.setString(1, student.id)
ps.setString(2, student.firstName)
ps.setString(3, student.lastName)
}
})
}
}但是,当我试图隐式创建PreparedStatementSetter时,我的SQL代码会失败。
我的隐函数是:
implicit def preparedStatementSetterImplicit(student: Student) = {
new PreparedStatementSetter() {
def setValues(ps: PreparedStatement) {
ps.setString(1, student.id)
ps.setString(2, student.firstName)
ps.setString(3, student.lastName)
}
}
}我试着用以下方法:
def insert(student: Student): Unit = {
jdbcTemplate.update("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
student)
}除以下异常外,我的SQL insert失败:
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)]; nested exception is java.sql.SQLSyntaxErrorException: incompatible data type in conversion我的隐式转换有什么问题?
发布于 2013-10-20 18:19:02
问题是编译器不需要进行隐式转换,因为jdbcTemplate.update有一个重载的类型签名,它只需要String和Object...,这将与String和Student匹配,而不需要隐式转换。您可以显式地这样做(我认为在代码中可读性更好)如下:
implicit class preparedStatementSetterImplicit(student: Student) {
def toPreparedStatement() = {
new PreparedStatementSetter() {
def setValues(ps: PreparedStatement) {
ps.setString(1, student.id)
ps.setString(2, student.firstName)
ps.setString(3, student.lastName)
}
}
}
}
def insert(student: Student) {
jdbcTemplate.update("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
student.toPreparedStatement())
}发布于 2013-10-20 18:08:40
您是否尝试过显式键入您的转换,例如:
implicit def student2pss(student: Student) : PreparedStatementSetter = {...}只有在转换后的类型与预期类型完全匹配时才使用隐式转换(如果没有显式类型,您的转换返回的是匿名类型,而不是PreparedStatementSetter),所以我不确定是否使用了转换。尝试将println添加到转换中,以查看它是否被触发。
编辑:为了解决这个问题,您可能需要为JdbcTemplate创建自己的包装器,并提供到它的转换:
class JdbcTemplateWrapper(val template: JdbcTemplate) {
def wrappedUpdate[DataType](statement: String, data: DataType)(implicit conv: DataType => PreparedStatementSetter) = {
template.update(statement, conv(data))
}
}
object JdbcTemplateWrapper {
implicit def wrapJdbc(template: JdbcTemplate) = new JdbcTemplateWrapper(template)
}在范围内,有一行
jdbcTemplate.customUpdate("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
student)首先隐式地将jdbcTemplate转换为JdbcTemplateWrapper (为了使它响应cusomUpdate,然后隐式地将Student转换为PreparedStatementSetter )。
https://stackoverflow.com/questions/19480820
复制相似问题