首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring -隐式转换

Spring -隐式转换
EN

Stack Overflow用户
提问于 2013-10-20 17:56:39
回答 2查看 1.3K关注 0票数 1

我只是在学习Scala,并尝试用Spring创建不同的场景。

以下代码执行得很完美:

代码语言:javascript
复制
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代码会失败。

我的隐函数是:

代码语言:javascript
复制
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)
    }
  } 
}

我试着用以下方法:

代码语言:javascript
复制
def insert(student: Student): Unit = {

  jdbcTemplate.update("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
                            student)
}

除以下异常外,我的SQL insert失败:

代码语言:javascript
复制
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

我的隐式转换有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-20 18:19:02

问题是编译器不需要进行隐式转换,因为jdbcTemplate.update有一个重载的类型签名,它只需要StringObject...,这将与StringStudent匹配,而不需要隐式转换。您可以显式地这样做(我认为在代码中可读性更好)如下:

代码语言:javascript
复制
  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())
  }
票数 4
EN

Stack Overflow用户

发布于 2013-10-20 18:08:40

您是否尝试过显式键入您的转换,例如:

代码语言:javascript
复制
implicit def student2pss(student: Student) : PreparedStatementSetter = {...}

只有在转换后的类型与预期类型完全匹配时才使用隐式转换(如果没有显式类型,您的转换返回的是匿名类型,而不是PreparedStatementSetter),所以我不确定是否使用了转换。尝试将println添加到转换中,以查看它是否被触发。

编辑:为了解决这个问题,您可能需要为JdbcTemplate创建自己的包装器,并提供到它的转换:

代码语言:javascript
复制
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)
}

在范围内,有一行

代码语言:javascript
复制
jdbcTemplate.customUpdate("INSERT INTO STUDENT (ID, FIRSTNAME, LASTNAME) VALUES(?,?,?)",
                        student)

首先隐式地将jdbcTemplate转换为JdbcTemplateWrapper (为了使它响应cusomUpdate,然后隐式地将Student转换为PreparedStatementSetter )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19480820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档