Spring JdbcTemplate批量操作
来源:互联网 发布:linux sqlite3 编辑:程序博客网 时间:2024/05/16 18:19
绝大多数JDBC驱动针对批量调用相同的prepared statement对象提供了性能提升。通过将这些更新操作封装到一个批量操作中,可以大量减少与数据库的操作频繁度。 本章节将详细描述使用JdbcTemplate或者SimpleJdbcTemplate进行批量操作的流程。
个人推荐:使用SimpleJdbcTemplate进行批量操作
使用JdbcTemplate进行批量操作
JdbcTemplate的批量操作特性需要实现特定的接口BatchPreparedStatementSetter
来进行的, 通过实现这个接口,并将其传入batchUpdate
方法进行调用。 这个接口有两个方法需要实现。一个叫做getBatchSize
来提供当前需要批量操作的数量。另外一个方法是setValues
允许你为prepared statement设置参数。这个方法将在整个过程中被调用的次数,则取决于你在getBatchSize
中所指定的大小。 下面的示例展示了根据传入的list参数更新actor表,而传入的list同时作为批量操作的参数。
public class JdbcActorDao implements ActorDao { private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public int[] batchUpdate(final List actors) { int[] updateCounts = jdbcTemplate.batchUpdate( "update t_actor set first_name = ?, last_name = ? where id = ?", new BatchPreparedStatementSetter() { public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, ((Actor)actors.get(i)).getFirstName()); ps.setString(2, ((Actor)actors.get(i)).getLastName()); ps.setLong(3, ((Actor)actors.get(i)).getId().longValue()); } public int getBatchSize() { return actors.size(); } } ); return updateCounts; } // ... additional methods}
如果你是通过读取文件进行批量操作,那么你可能需要一个特定的批量操作的数量,不过最后一次的批量操作,你可能没有那么多数量的记录。 在这种情况下,你可以实现InterruptibleBatchPreparedStatementSetter
接口,从而允许你在某些情况中断批量操作,isBatchExhausted
方法允许你指定一个终止批量操作的信号量。
使用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作为返回值。
- Spring JdbcTemplate批量操作
- spring jdbctemplate批量操作
- spring jdbcTemplate批量更新操作
- Spring 使用 JdbcTemplate 批量操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- Spring JdbcTemplate 批量插入或更新操作
- spring JdbcTemplate批量更新
- spring jdbctemplate 批量新增
- JdbcTemplate 执行批量操作
- jdbcTemplate 批量操作
- Spring源码分析——JdbcTemplate执行批量insert操作
- Spring批量更新JdbcTemplate.batchUpdate()
- Spring批量更新JdbcTemplate.batchUpdate()
- 拖拽程序(html+css+javascript)
- 什么是主生产计划管理?
- sql——用系统存储过程给列改名
- Android学习札记3:对View.MeaureSpec的一些理解
- 用户登录权限Forms验证方法
- Spring JdbcTemplate批量操作
- 收录各种猥琐的Java笔试/面试题目
- 存储过程
- 如何令WIZnet以太网芯片/模块实现PoE(PowerOverEthernet)?
- eclipse中clean的作用
- 通过读代码学习软件架构设计
- java URL以及UrlConnection使用解析
- ROW_NUMBER() over(order by id)分页存储过程 代码直接可用
- delphi实现数字签名