【问题标题】:Java ResultSet, SetObject vs SetString/SetDate/etcJava ResultSet、SetObject 与 SetString/SetDate/等
【发布时间】:2011-08-21 02:32:39
【问题描述】:

我想知道是否有人认为在准备语句时将PreparedStatement.setObject 用于所有数据类型是不好的做法。一个用例是具有通用 executeQuery() 方法的 DAO,该方法可以重复用于所有查询,而不必担心其数据类型。

【问题讨论】:

    标签: java jdbc resultset


    【解决方案1】:

    ResultSet 接口没有setObject(..) 方法。它只有一个updateObject(..) 方法。你是说PreparedStatement.setObject(..) 吗?

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

    【讨论】:

    • 我的意思是 statement.setObject,感谢您的指出。最好的用例是当我们的 DAO 需要执行 5 个不同的更新语句时。在这种情况下,拥有 5 种不同的更新方法会引入大量重复代码,因为唯一的区别是 sql 语句和参数可以是动态的。
    【解决方案2】:

    你可以这样做。

    例如

    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 驱动程序将进行类型检查。唯一的缺点可能是(次要)开销,但与您最终得到的更好的可维护代码相比,这可以忽略不计。此外,像 Hibernate/JPA 这样的大多数 ORM 框架也在底层使用了这一点。

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2011-07-01
      相关资源
      最近更新 更多