DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > MySQL > 基础知识

JDBC批量操作JdbcTemplate或者SimpleJdbcTemplate

绝大多数JDBC驱动针对批量调用相同的prepared statement对象提供了性能提升。通过将这些更新操作封装到一个批量操作中,可以大量减少与数据库的操作频繁度。 本章节将详细描述使用JdbcTemplate或者SimpleJdbcTemplate进行批量操作的流程。

 

1、使用JdbcTemplate进行批量操作

JdbcTemplate的批量操作特性需要实现特定的接口BatchPreparedStatementSetter 来 进行的, 通过实现这个接口,并将其传入batchUpdate 方法进行调用。 这个接口有两个方法需要实现。一个叫做getBatchSize 来提供当前需要批 量操作的数量。另外一个方法是setValues 允许你为prepared statement设置参数。这个方法将在整个过程中被调用的次数,则取决于你在getBatchSize 中所指定的大小。 下面的示例展示了根据传入的list参数更新actor表,而传入的list同时作为批量操作的参数。

Java代码  
  1. public class JdbcActorDao implements ActorDao {  
  2.     private JdbcTemplate jdbcTemplate;  
  3.   
  4.     public void setDataSource(DataSource dataSource) {  
  5.         this.jdbcTemplate = new JdbcTemplate(dataSource);  
  6.     }  
  7.   
  8.     public int[] batchUpdate(final List actors) {  
  9.         int[] updateCounts = jdbcTemplate.batchUpdate(  
  10.                 "update t_actor set first_name = ?, last_name = ? where id = ?",  
  11.                 new BatchPreparedStatementSetter() {  
  12.                     public void setValues(PreparedStatement ps, int i) throws SQLException {  
  13.                         ps.setString(1, ((Actor)actors.get(i)).getFirstName());  
  14.                         ps.setString(2, ((Actor)actors.get(i)).getLastName());  
  15.                         ps.setLong(3, ((Actor)actors.get(i)).getId().longValue());  
  16.                     }  
  17.   
  18.                     public int getBatchSize() {  
  19.                         return actors.size();  
  20.                     }  
  21.                 } );  
  22.         return updateCounts;  
  23.     }  
  24.   
  25.     //  ... additional methods  
  26. }  
 

如果你是通过读取文件进行批量操作,那么你可能需要一个特定的批量操作的数量,不过最后一次的批量操作,你可能没有那么多数量的记录。 在这种情况下,你可以实现InterruptibleBatchPreparedStatementSetter 接 口,从而允许你在某些情况中断批量操作,isBatchExhausted 方法允许你指定一个终止批量操作的信号量。

2、使用SimpleJdbcTemplate进行批量操作

SimpleJdbcTemplate 类提供了另外一种批量操作的方式。无需实现 一个特定的接口,你只需要提供所有在调用过程中要用到的参数,框架会遍历这些参数值,并使用内置的prepared statement类进行批量操作。API将根据你是否使用命名参数而有所不同。对于使用命名参数的情况,你需要提供一个SqlParameterSource 的数组, 其中的每个元素将将作为批量操作的参数。 你可以使用SqlParameterSource.createBatch 方法, 通过传入一个JavaBean的数组或者一个包含了参数键值对的Map数组来创建这个数组。

下面的示例展示了使用命名参数进行批量更新的方法:

Java代码  
  1. public class JdbcActorDao implements ActorDao {  
  2.     private SimpleJdbcTemplate simpleJdbcTemplate;  
  3.   
  4.     public void setDataSource(DataSource dataSource) {  
  5.         this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);  
  6.     }  
  7.   
  8.     public int[] batchUpdate(final List<Actor> actors) {  
  9.         SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(actors.toArray());  
  10.         int[] updateCounts = simpleJdbcTemplate.batchUpdate(  
  11.                 "update t_actor set first_name = :firstName, last_name = :lastName where id = :id",  
  12.                 batch);  
  13.         return updateCounts;  
  14.     }  
  15.   
  16.     //  ... additional methods  
  17. }  
 

对于使用传统的“?”作为参数占位符的情况,你可以传入一个List,包含了所有需要进行批量更新的对象。这样的对象数组必须与每个SQL Statement的占位符以及他们在SQL Statement中出现的位置一一对应。

下面是同样的例子,使用的传统的“?”作为参数占位符:

Java代码  
  1. public class JdbcActorDao implements ActorDao {  
  2.     private SimpleJdbcTemplate simpleJdbcTemplate;  
  3.   
  4.     public void setDataSource(DataSource dataSource) {  
  5.         this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);  
  6.     }  
  7.   
  8.     public int[] batchUpdate(final List<Actor> actors) {  
  9.         List<Object[]> batch = new ArrayList<Object[]>();  
  10.         for (Actor actor : actors) {  
  11.             Object[] values = new Object[] {  
  12.                     actor.getFirstName(),  
  13.                     actor.getLastName(),  
  14.                     actor.getId()};  
  15.             batch.add(values);  
  16.         }  
  17.         int[] updateCounts = simpleJdbcTemplate.batchUpdate(  
  18.                 "update t_actor set first_name = ?, last_name = ? where id = ?",  
  19.                 batch);  
  20.         return updateCounts;  
  21.     }  
  22.   
  23.     //  ... additional methods  
  24. }  

 所有的批量更新的方法都会返回一组int的数组,表示在整个操作过程中有多少记录被批量更新。 这个数量是由JDBC驱动所返回的,有时这个返回并不可靠,尤其对于某些JDBC驱动只是简单的返回-2作为返回值。


本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号