Java ResultSet中SetObject与SetString/SetDate等的区别

24

我想知道是否有人认为在准备语句时对所有数据类型使用PreparedStatement.setObject是不良惯例。使用这种方法的一个典型案例是一个具有通用executeQuery()方法的DAO,可以重复使用该方法来处理所有查询,而无需担心其数据类型。

2个回答

14
你可以这样做。
例如。
preparedStatement = connection.prepareStatement(SQL_INSERT);
SqlUtil.setValues(preparedStatement, user.getName(), user.getPassword(), user.getAge());

使用

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

JDBC驱动程序将执行类型检查。唯一的缺点可能是(轻微的)开销,但与最终获得的更易于维护的代码相比,这几乎可以忽略不计。此外,大多数ORM框架(如Hibernate/JPA)也在深层内部使用了它。


1

ResultSet 接口没有 setObject(..) 方法。它只有一个 updateObject(..) 方法。你是不是想使用 PreparedStatement.setObject(..)

在这种情况下,我认为这不是一个坏习惯,但也不是一个好的解决方案。对于我来说,我真的不理解“通用 DAO”的必要性。你能详细解释一下这个想法吗?


我确实是指statement.setObject,谢谢你指出来。最佳用例是当我们的DAO需要执行5个不同的更新语句时。在这种情况下,拥有5个不同的更新方法会引入大量重复代码,因为唯一的区别是SQL语句和参数可以是动态的。 - S.D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接