在重构之前,我使用jdbcTemplate,preparedStatementCreator和GeneratedKeyHolder在数据库中插入一行来存储生成的插入行的id.
jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder)
Run Code Online (Sandbox Code Playgroud)
但是,现在我尝试使用我的jdbcTemplate执行更新,但现在使用preparedStatementSetter.我能看到的唯一方法是jdbcTemplate.update(String sql,PreparedStatementSetter),但现在我不知道如何返回生成列的id.
PreparedStatementSetter pss = new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement preparedStatement)
throws SQLException {
preparedStatement.setString(1, pupil.getFirstname());
preparedStatement.setString(2, pupil.getSurname());
preparedStatement.setString(3, pupil.getGivenName());
preparedStatement.setDate(4, pupil.getDob());
}
};
jdbcTemplate.update("INSERT INTO STUDENTS "+ "(FIRSTNAME, SURNAME, GIVEN_NAME, DOB) VALUES (?,?,?,?)",pss);
Run Code Online (Sandbox Code Playgroud)
假设我对prepareStatements的方法是正确的,有谁知道如何返回生成的id的值?
我有以下代码行:
case set: Set[Any] => setFormat[Any].write(set)
Run Code Online (Sandbox Code Playgroud)
但是,编译器会发出警告:
非变量类型参数类型模式中的任何类型scala.collection.Set [Any]未选中,因为它被擦除消除[warn]
很公平.
所以我改变了我的路线:
case set: Set[_] => setFormat[Any].write(set)
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误:
[错误]发现:scala.collection.Set [_]
[error] required:scala.collection.Set [Any]
Q1.这两者有什么区别?
然后我将我的代码更改为以下内容:
case set: Set[_] => setFormat[Any].write(set.map(s => s))
Run Code Online (Sandbox Code Playgroud)
现在很高兴没有任何错误或警告.
Q2.这为什么有用?