在我的项目中,我使用Spring 3.0 JdbcTemplate来实现DAO类。它提供了方便的方法,如query(...),update(...)等。这些方法接受对象作为绑定到查询的参数。在javadoc中声明,它留给PreparedStatement来猜测相应的SQL类型。因此,当使用原语或包装器时,它很简单。
但在我的代码中,我使用特殊的类来表示id。例如UserId。它有公共方法来获取其整数值 - getInt()。现在我必须使用
userId.getInt()
每次我需要将UserId的实例传递给JdbcTemplate查询。如果我忘记并写下
userId
我显然得到了SQLException,因为我的UserId对象不能被预准备语句(here are the rules to map Object type to corresponding SQL type)使用。但是在编译期间无法发现这种类型的错误(因为JdbcTemplate接受Object作为参数),这使得bug变得容易。
有什么方法可以避免调用.getInt()并将我的UserId对象传递给查询吗?
答案 0 :(得分:1)
我想你可以使用新版org.springframework.jdbc.core.JdbcTemplate.newArgPreparedStatementSetter(Object[])
覆盖org.springframework.jdbc.core.ArgPreparedStatementSetter
,doSetValue
检查(UserId
}对象argValue是否属于您的特殊{{1}}类型。