1. 程式人生 > >Spring JdbcTemplate批量操作

Spring JdbcTemplate批量操作

使用SimpleJdbcTemplate進行批量操作

SimpleJdbcTemplate類提供了另外一種批量操作的方式。無需實現一個特定的介面,你只需要提供所有在呼叫過程中要用到的引數,框架會遍歷這些引數值,並使用內建的prepared statement類進行批量操作。API將根據你是否使用命名引數而有所不同。對於使用命名引數的情況,你需要提供一個SqlParameterSource的陣列, 其中的每個元素將將作為批量操作的引數。 你可以使用SqlParameterSource.createBatch方法,通過傳入一個JavaBean的陣列或者一個包含了引數鍵值對的Map陣列來建立這個陣列。

下面的示例展示了使用命名引數進行批量更新的方法:

public class JdbcActorDao implements ActorDao {
    private SimpleJdbcTemplate simpleJdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

    public int[] batchUpdate(final List<Actor> actors) {
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(actors.toArray());
        int[] updateCounts = simpleJdbcTemplate.batchUpdate(
                "update t_actor set first_name = :firstName, last_name = :lastName where id = :id",
                batch);
        return updateCounts;
    }

    //  ... additional methods
}

對於使用傳統的“?”作為引數佔位符的情況,你可以傳入一個List,包含了所有需要進行批量更新的物件。這樣的物件陣列必須與每個SQL Statement的佔位符以及他們在SQL Statement中出現的位置一一對應。

下面是同樣的例子,使用的傳統的“?”作為引數佔位符:

public class JdbcActorDao implements ActorDao {
    private SimpleJdbcTemplate simpleJdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

    public int[] batchUpdate(final List<Actor> actors) {
        List<Object[]> batch = new ArrayList<Object[]>();
        for (Actor actor : actors) {
            Object[] values = new Object[] {
                    actor.getFirstName(),
                    actor.getLastName(),
                    actor.getId()};
            batch.add(values);
        }
        int[] updateCounts = simpleJdbcTemplate.batchUpdate(
                "update t_actor set first_name = ?, last_name = ? where id = ?",
                batch);
        return updateCounts;
    }

    //  ... additional methods
}

所有的批量更新的方法都會返回一組int的陣列,表示在整個操作過程中有多少記錄被批量更新。 這個數量是由JDBC驅動所返回的,有時這個返回並不可靠,尤其對於某些JDBC驅動只是簡單的返回-2作為返回值。