在我的项目中,我使用 Spring 3.0 JdbcTemplate 来实现 DAO 类。它提供了方便的方法,如 query(...)、update(...) 等。这些方法接受对象作为绑定到查询的参数。在 javadoc 中指出,由 PreparedStatement 来猜测相应的 SQL 类型。因此,当使用原语或包装器时,它很简单。
但是在我的代码中,我使用特殊的类来表示 id。例如用户 ID。它具有获取其整数值的公共方法 - getInt()。现在我必须使用
userId.getInt()
每次我需要将 UserId 的实例传递给 JdbcTemplate 查询时。如果我忘记写只是
userId
我显然得到了 SQLException,因为我的 UserId 对象不能被准备好的语句使用(这里是将对象类型映射到相应 SQL 类型的规则)。但是这种类型的错误在编译过程中无法发现(因为 JdbcTemplate 接受 Object 作为参数),这使得引入 bug 变得容易。
有什么办法可以避免调用 .getInt() 并将我的 UserId 对象传递给查询?