我正在尝试使用Spring 3 JdbcTemplate编写日期信息。我有如下内容:
public void foo(DateMidnight date){
jdbcTemplate().update(sql,date);
}
如果日期是java.util.Date,这很好,但是使用DateMidnight,这就会爆炸。我当然可以改为:
public void foo(DateMidnight date){
jdbcTemplate().update(sql,date.toDate());
}
但是很容易忘记这样做。有没有办法告诉 Spring (3),每当 JdbcTemplate 获得 DateMidnight(或 DateTime)时,它应该在存储之前将其转换为 Date?我阅读了有关转换服务 API 的信息,但从代码示例中我看到它仅适用于 Spring MVC 中的转换。
据我了解,您需要覆盖JdbcTemplate.newArgPreparedStatementSetter()
并在那里实现适当的转换,如下所示:
protected PreparedStatementSetter newArgPreparedStatementSetter(Object[] args) {
Object[] converted = new Object[args.length];
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
if (arg instanceof DateTime) {
converted[i] = ((DateTime) arg).toDate();
} else {
converted[i] = arg;
}
}
return super.newArgPreparedStatementSetter(converted);
}
对于这样的事情,最好的解决方案是创建自己的数据访问对象(DAO
)层。永远不要让你的代码直接与JdbcTemplate
对话,编写一个知道如何处理DateMidnight
(以及你需要的任何其他东西)的层,然后始终编写代码与DAO
对话。
这里有一些使用JdbcTemplate
和DAO
的教程 - 它足够长,对我来说在这里写出来很愚蠢,但这些都很好。
- 第一条
- 第二条