绝大多数JDBC驱动针对批量调用相同的prepared
statement对象提供了性能提升。通过将这些更新操作封装到一个批量操作中,可以大量减少与数据库的操作频繁度。
本章节将详细描述使用JdbcTemplate或者SimpleJdbcTemplate进行批量操作的流程。
1、使用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
方法允许你指定一个终止批量操作的信号量。
2、使用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作为返回值。
分享到:
相关推荐
jdbc批量操作数据分析与实例,主要是通过实际可执行的例子来说明批量操作与一条条数据插入的实际性能,并做了相应的分析
Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。
一、JDBC的批量插入 一、JDBC的批量更新 一、JDBC的批量删除 一、JDBC的批量修改
文章地址:...Java-JDBC【之】批量插入操作、优化取消自动提交(提速40+倍) 1.JDBC批量操作 2.两种实现方式 3.优化,取消自动提交 4.完整源码 《目录:Java-JDBC学习(编写中...)》 《幕》
针对oracle中blob字段的操作,能批量快速的插入大字段,效率非常高
JDBC连接数据库大全,连接数据库不用急。
JDBC创建触发器 JDBC存储过程 JDBC创建表 数据备份 java备份数据库/JAVA恢复数据、java导入sql脚本
自己封装的JDBC工具类,能够实现对数据库的增删改查以及批处理,事物处理等操作
SSH笔记-管理Session和批量操作数据库(通过JDBC api 批量操作、通过session进行批量操作、通过statelesssession进行批量操作)
11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用...
11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用...
第十二章 JDBC批处理操作批量处理允许您将相关的SQL语句分组到批处理中,并通过对数据库的一次调用提交它们。当您一次向数据库发送多个SQL语句时,可以减少连接
此JDBC工具类功能强大,不仅支持查询,还可支持批量操作指定的SQL
本项目对如何在Springboot项目中整合hive-jdbc进行简单示例和介绍,亲测可用,请放心下载。
使用javaJDBC连接hive数据,实现简单的操作!
经常在对批量CUD的时候进行. 2.数据库连接池:把对数据库的连接放入一个容器中,要的时候就取,不需要的时候就还会去.程序启动的时候慢点,后期对数据库CRUD大幅度提升.(常用开源连接池DBCP) 3.特殊类型(date--日期,clob...
主要介绍了详解jdbc实现对CLOB和BLOB数据类型的操作的相关资料,这里实现写入操作与读写操作,需要的朋友可以参考下
1.包含增删改查基本操作 2.包含单条操作和批量操作
主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,结合实例形式较为详细的分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧,需要的朋友可以参考下
我遇到的,之前使用ojdbc14.jar(不记得哪个版本了)批量插入10万条,实际只插入了3万多条,其它的丢失了,换ojdbc6.jar后,一次commit批量插入100万条也OK了。 尽量使用和数据库版本一致的驱动,有bug时,换高...