Spring JdbcTemplate批量操作
阿新 • • 發佈:2018-12-31
使用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作為返回值。