`

Spring JdbcTemplate批量操作

阅读更多

绝大多数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作为返回值。

 

分享到:
评论

相关推荐

    SpringJdbcTemplate封装工具类

    在描述中提到的“规范model格式接口”,可能是指创建一套标准的数据访问接口,这些接口定义了CRUD(Create、Read、Update、Delete)操作,并由SpringJdbcTemplate实现具体的数据库交互逻辑。这样做的好处是解耦了...

    使用Spring JDBCTemplate进行增删改查curd操作

    JdbcTemplate还支持批量操作,比如批量插入: ```java public void batchInsert(List&lt;User&gt; users) { List[]&gt; batchArgs = new ArrayList(); for (User user : users) { batchArgs.add(new Object[]{user....

    SpringBoot JdbcTemplate批量操作的示例代码

    SpringBoot JdbcTemplate批量操作是提高数据处理效率的重要手段,尤其在处理大量数据插入或更新时。JdbcTemplate作为Spring框架的一部分,提供了便捷且安全的数据库访问方式,它简化了JDBC的使用,避免了手动管理...

    Spring JdbcTemplate api

    ### Spring JdbcTemplate API:数据库操作的模板模式 #### 概述 在Spring框架中,`JdbcTemplate`是一个用于简化JDBC编程的工具类,它采用了模板模式来分离数据库访问中的不变和可变部分,提供了一种更加健壮且易于...

    Spring JdbcTemplate.batchUpdate 例子

    总之,`Spring JdbcTemplate.batchUpdate`是处理批量数据库操作的强大工具,它可以提高效率,减少与数据库的交互次数。然而,正确地使用它需要对事务管理、异常处理和性能优化有深入的理解。通过合理的配置和良好的...

    SSH笔记-Spring JdbcTemplate

    6. **批量操作**:JdbcTemplate还支持批量更新,使用`batchUpdate()`方法可以一次执行多条SQL更新语句,提高了性能。 7. **预编译的SQL(PreparedStatement)**:JdbcTemplate默认使用PreparedStatement,这是一个...

    spring jdbctemplate实例

    此外,JdbcTemplate还提供了其他高级功能,如批量操作、分页查询、存储过程调用等。同时,它也支持PreparedStatement,可以防止SQL注入攻击。对于性能要求较高的互联网应用,JdbcTemplate的这些特性使其成为理想的...

    Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站.htm

    Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站

    Spring-JdbcTemplate

    它提供了一系列高级的数据库操作模板方法,封装了JDBC API的常见模式,如查询、更新和批量操作,从而避免了常见的资源管理、异常处理和SQL语句执行的重复性编码工作,提高了代码的可读性和可维护性。 #### 二、...

    一个简单的spring-jdbctemplate扩展

    5. **批量操作**:优化了批处理功能,使得一次性执行多条SQL语句更加高效。 总的来说,这个“一个简单的spring-jdbctemplate扩展”项目旨在通过提供更高级别的抽象和便捷的API,使得开发人员在使用Spring ...

    Spring JdbcDaoSupport 批量插入数据

    批量插入数据在处理大量数据时能显著提升性能,因为数据库通常会对批量操作进行优化。在`JdbcDaoSupport`中,我们可以通过`JdbcTemplate`的`batchUpdate(String sql, BatchPreparedStatementSetter setter)`方法来...

    Spring--JdbcTemplate.pdf

    对于批量操作,JdbcTemplate提供了以下支持: 1. 执行批量添加操作:通过遍历List集合,将每个数组作为参数执行SQL语句进行添加。 2. 执行批量删除和修改操作:也是遍历List集合,对每个元素执行相应的SQL语句。 3. ...

    springBoot+springBatch批量处理数据demo

    在这个“springBoot+springBatch批量处理数据demo”中,我们将探讨如何将这两个强大的工具结合在一起,实现高效的数据处理。 首先,SpringBoot的核心特性在于其自动配置,它通过`@SpringBootApplication`注解自动...

    spring框架 jdbcTemplate

    在这个项目中,我们可以看到通过Spring MVC与JdbcTemplate结合,实现对数据的查询、删除、修改和添加等基本操作。 1. **JdbcTemplate介绍**: JdbcTemplate是Spring框架中的一个核心组件,主要用于简化数据库操作...

    JdbcTemplate的批量方法使用

    在Java的JDBC编程中,`JdbcTemplate`是Spring框架提供的一个强大且便捷的工具,用于简化数据库操作。它提供了一系列方法,包括批量处理SQL语句,极大地提高了开发效率并减少了错误的可能性。在这个场景中,我们将...

    Spring 中jdbcTemplate 实现执行多条sql语句示例

    在Spring框架中,JdbcTemplate是用于简化数据库操作的一个重要工具。它提供了执行SQL语句的能力,包括单条语句执行和批处理。本文将详细解释如何使用JdbcTemplate来执行多条SQL语句,以及其在事务管理中的作用。 ...

    Spring框架中jdbcTemplate 的使用.doc

    如果需要批量执行SQL语句,JdbcTemplate还提供了`batchUpdate()`方法,可以一次执行多个更新操作。 9. **性能优化**: JdbcTemplate通过缓存预编译的SQL语句(PreparedStatement),提高了性能,并且可以避免多次...

    jdbcTemplate分页彻底解决,使用游标滚动

    在Java的Spring框架中,JdbcTemplate是一个非常重要的组件,它为数据库操作提供了简便的模板方法。在处理大量数据时,传统的分页方式可能会导致内存溢出,这时可以使用游标滚动来实现高效的分页。本篇文章将深入探讨...

    spring jdbc Templatetest 访问mysql数据库,批量插入数据

    本主题将详细讲解如何使用Spring JDBC Template访问MySQL数据库并进行批量插入数据的操作。 首先,我们需要在项目中引入Spring框架的相关依赖,通常包括`spring-context`和`spring-jdbc`。这些可以在Maven或Gradle...

Global site tag (gtag.js) - Google Analytics