prepareStatement可以像Statement一样做吗?

时间:2014-01-21 07:10:58

标签: java sql oracle prepared-statement

我的数据库是Oracle。 我知道Statement可以将SQL句子(插入或删除或更新)混合到一个批处理中。这是我的代码。

DBConnection db = new DBConnection();
Connection c = db.getConn();
Statement s = null ;


try
{ 
    String sql = "insert into t1(id, name) values ('10', 'apple')";
    String sql1 = "insert into t1(id, name) values ('14', 'pie')";
    String sql2 = "delete from t1 where id = '10'";
    s = c.createStatement();

    s.addBatch(sql);
    s.addBatch(sql1);
    s.addBatch(sql2);

    int[] re = s.executeBatch();...

我的问题是可以PreparedStatement这样做吗?怎么样?

2 个答案:

答案 0 :(得分:0)

您可以按PreparedStatement.addBatch()创建批处理,然后按PreparedStatement.executeBatch

执行

有关PreparedStatement的更多信息,您可以查看documentation

如果我没有错,你想做这样的事情:

public void save(List<Entity> elements) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
try {
    connection = database.getConnection();
    statement = connection.prepareStatement(SQL_INSERT);
    for (int i = 0; i < elements.size(); i++) {
        Element element= elements.get(i);
        statement.setString(1, element.getProperty1());
        statement.setString(2, element.getProperty2());
        .....

        statement.addBatch();
        if ((i + 1) % 200 == 0) {
            statement.executeBatch(); // Execute every 200 items.
        }
    }
    statement.executeBatch();
} finally {
    if (statement != null) try { statement.close(); } catch (SQLException e) { //}
    if (connection != null) try { connection.close(); } catch (SQLException e) {//}
}

}

在这种情况下,我执行每200件物品,如果你希望你可以自己设定。但是要测试它,因为它还取决于驱动程序对批处理操作的限制。

答案 1 :(得分:0)

<强>声明:

用于对数据库的通用访问。在运行时使用静态SQL语句时很有用。 Statement接口不能接受参数。

<强>的PreparedStatement:

计划多次使用SQL语句时使用。 PreparedStatement接口在运行时接受输入参数。

<强>的CallableStatement:

当您要访问数据库存储过程时使用。 CallableStatement接口也可以接受运行时输入参数。