通过JDBC 操作数据库 有三种方式  第一种 是 使用 JDBC的JDBC Template ,一种是NamedParameterJdbcTemplate ,一种是 使用 Simple JDBC Insert。

具体的例子 可以 参考下面的 几种 示例。 因为我的 类 是 使用 的 Map  进行传参,而且又不想 使用 占位符 , 所以变使用了 Simple JDBC Insert

参考文档 :

  1. Spring JDBC 常用批量操作及插入操作  https://m.imooc.com/article/details?article_id=13993
  2. Spring - JDBC Batch Update https://www.logicbig.com/tutorials/spring-framework/spring-data-access-with-jdbc/spring-jdbc-batch-update.html

  3. jdbctemplate batchupdate 的事务管理 http://www.voidcn.com/article/p-qbkywcbs-te.html

A JDBC batch update is multiple updates using the same database session. That is, we don't have to open connections multiple times.

In our previous example, let's say we want to insert multiple Person objects in the database. Followings are the various ways to do that in Spring.

Using JdbcTemplate

  1. batchUpdate(String... sql) :

    jdbcTemplate.batchUpdate(
    "insert into PERSON (FIRST_NAME, LAST_NAME, ADDRESS) values ('Dana', 'Whitley', '464 Gorsuch Drive')", "insert into PERSON (FIRST_NAME, LAST_NAME, ADDRESS) values ('Robin', 'Cash', '64 Zella Park')" );
  2. batchUpdate(String sql, List<Object[]> batchArgs) : 
    jdbcTemplate.batchUpdate("insert into PERSON (FIRST_NAME, LAST_NAME, ADDRESS) values (?, ?, ?)", Arrays.asList(new Object[]{"Dana", "Whitley", "464 Gorsuch Drive"}, new Object[]{"Robin", "Cash", "64 Zella Park"}) );
  3. batchUpdate(String sql, List <Object[]> batchArgs, int[] argTypes) : 
    jdbcTemplate.batchUpdate("insert into PERSON (FIRST_NAME, LAST_NAME, ADDRESS) values (?, ?, ?)", Arrays.asList(new Object[]{"Dana", "Whitley", "464 Gorsuch Drive"}, new Object[]{"Robin", "Cash", "64 Zella Park"}), new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR} );
  4. batchUpdate(String sql, BatchPreparedStatementSetter pss) 
    final List<Person> persons = Arrays.asList( Person.create("Dana", "Whitley", "464 Gorsuch Drive"), Person.create("Robin", "Cash", "64 Zella Park") ); String sql = "insert into Person (first_Name, Last_Name, Address) values (?, ?, ?)"; int[] updateCounts = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, persons.get(i).getFirstName()); ps.setString(2, persons.get(i).getLastName()); ps.setString(3, persons.get(i).getAddress()); } @Override public int getBatchSize() { return persons.size(); } });
  5. batchUpdate(String sql, Collection<T> batchArgs, int batchSize, ParameterizedPreparedStatementSetter <T> pss). This method can break the batch updates into serveral smaller batches specified by batchSize. 
    final List<Person> persons = Arrays.asList( Person.create("Dana", "Whitley", "464 Gorsuch Drive"), Person.create("Robin", "Cash", "64 Zella Park") ); String sql = "insert into Person (first_Name, Last_Name, Address) values (?, ?, ?)"; int[][] updateCounts = jdbcTemplate.batchUpdate(sql, persons, persons.size(), new ParameterizedPreparedStatementSetter<Person>() { @Override public void setValues(PreparedStatement ps, Person person) throws SQLException { ps.setString(1, person.getFirstName()); ps.setString(2, person.getLastName()); ps.setString(3, person.getAddress()); } });

Using NamedParameterJdbcTemplate

  1. batchUpdate(String sql, Map <String,?>[] batchValues)

    List<Person> persons = Arrays.asList( Person.create("Dana", "Whitley", "464 Gorsuch Drive"), Person.create("Robin", "Cash", "64 Zella Park") ); String sql = "insert into Person (first_Name, Last_Name, Address) " + "values (:firstName, :lastName, :address)"; List<Map<String, Object>> batchValues = new ArrayList<>(persons.size()); for (Person person : persons) { batchValues.add( new MapSqlParameterSource("firstName", person.getFirstName()) .addValue("lastName", person.getLastName()) .addValue("address", person.getAddress()) .getValues()); } int[] updateCounts = namedParamJdbcTemplate.batchUpdate(sql, batchValues.toArray(new Map[persons.size()]));
  2. batchUpdate(String sql, SqlParameterSource[] batchArgs) 
    List<Person> persons = Arrays.asList( Person.create("Dana", "Whitley", "464 Gorsuch Drive"), Person.create("Robin", "Cash", "64 Zella Park") ); String sql = "insert into Person (first_Name, Last_Name, Address) " + "values (:firstName, :lastName, :address)"; SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(persons.toArray()); int[] updateCounts = namedParamJdbcTemplate.batchUpdate(sql, batch);

Using SimpleJdbcInsert

  1. executeBatch(Map<String,?>... batch)  对大小写 不敏感 , 只要 Columns 中有 数值 就可以 

    List<Map<String, Object>> batchValues = new ArrayList<>(persons.size()); for (Person person : persons) { Map<String, Object> map = new HashMap<>(); map.put("first_Name", person.getFirstName()); map.put("last_Name", person.getLastName()); map.put("address", person.getAddress()); batchValues.add(map); } SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("PERSON"); int[] ints = simpleJdbcInsert.executeBatch(batchValues.toArray(new Map[persons.size()]));
  2. public int[] executeBatch(SqlParameterSource... batch). We don't have to specify any column to bean field name mapping. It can figure out the differences like underscores in the table column names. For example bean#firstName is automatically mapped to column FIRST_NAME. 
    List<Person> persons = Arrays.asList( Person.create("Dana", "Whitley", "464 Gorsuch Drive"), Person.create("Robin", "Cash", "64 Zella Park") ); SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource) .withTableName("PERSON") .usingGeneratedKeyColumns("id"); SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(persons.toArray()); int[] ints = simpleJdbcInsert.executeBatch(batch);
  3. 我自己的示例 ,首先我需要 多批次的操作,其次 我已经 封装好了 一个 Map  使用 Java 8 的 流的 方式 将Map 的list 转换 为 Map 数组。

在这里 我就碰到了 这个坑 如果是 传统的 list.toArray() , 那么 其实 转换出来的 是一个 Object 数组, 这样子使用的 方式 是 Bean  命名 的方式。

for ( int i = 0 ; i < list.size() ; i +=batchSize ) {final List<Map<String, Object>> batchList = list.subList(i, i + batchSize > list.size() ? list.size() : i + batchSize);batchList.stream().forEach(putMapValue(batchId, site));Map[] maps = batchList.stream().toArray(Map[]::new);SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(maps);jdbcInsert.executeBatch(batch);}
private Consumer<Map<String, Object>> putMapValue(String batchId, String site) {return map -> {        map.put("UUID", UUID.randomUUID().toString());map.put("LAST_BATCH_ID",batchId);map.put("SITE", site);};}

for ( int i = 0 ; i < list.size() ; i +=batchSize ) {final List<Map<String, Object>> batchList = list.subList(i, i + batchSize > list.size() ? list.size() : i + batchSize);batchList.stream().forEach(putMapValue(batchId, site));Map[] maps = batchList.stream().toArray(Map[]::new);SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(maps);jdbcInsert.executeBatch(batch);}

转载于:https://www.cnblogs.com/mythdoraemon/p/10526360.html

Spring JDBC 批量操作 数据相关推荐

  1. 使用Spring JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)

    http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...

  2. spring boot demo(spring jdbc访问数据)

    Accessing Relational Data using JDBC with Spring 您将使用Spring JdbcTemplate 构建应用,访问数据库中数据. 下面的简单数据访问逻辑, ...

  3. Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据

    概述 如何获取本地数据连接 示例从DBCP数据源中获取Oracle的本地连接对象 相关接口操作 LobCreator LobHandler 插入LOB类型的数据 以块数据的方式读取LOB数据 以流数据 ...

  4. Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问

    第 10 章 使用JDBC进行数据访问 10.1. 简介 Spring提供的JDBC抽象框架由core, datasource,object和support四个不同的包组成. 就和它名字的暗示一样,o ...

  5. Spring 数据访问那些事儿(一)spring + jdbc

    从本篇文章开始,将会陆续为大家介绍一些spring访问数据的方式,从简单直接的JDBC到JdbcTemplate,再到一些复杂的ORM框架(如mybatis.hibernate).每篇文章都跟着一个简 ...

  6. Spring DAO(2):Spring JDBC 访问数据库

    以下完整示例代码地址:https://gitee.com/assad/springframework-test-daohttps://gitee.com/assad/springframework-t ...

  7. Java EE---通过Spring JDBC实现数据库的增、删、改、查

    Spring JDBC之update.query方法 1.项目清单 2.全部代码 2.1.student 2.2.stuDao 2.3.applicationContext.xml 2.4.test ...

  8. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  9. 使用Spring JDBC框架连接并操作数据库

    在前一篇博文JAVA通过JDBC连接并操作MySQL数据库中,我们知道如何通过JDBC连接并操作数据库,但是请看程序,整个程序连接数据库和关闭数据库占了很大一部分代码量,而且每次我们执行一下数据库操作 ...

最新文章

  1. 使用Docker的macvlan为容器提供桥接网络及跨主机通讯
  2. linux进程间通讯-共享内存
  3. 深入浅出Spring Security(二):FilterChainProxy的创建过程
  4. 如何看懂dtd文档?
  5. 利用CGLib实现动态代理实现Spring的AOP
  6. Vue「五」—— 动态组件、插槽、自定义指令
  7. 【LeetCode】【HOT】17. 电话号码的字母组合(递归)
  8. JavaScript图片幻灯片显示效果
  9. python给女朋友_【转】python实战——教你用微信每天给女朋友说晚安
  10. 利用卷积进行序列到序列学习
  11. oracle instr函数 判断字段中是否有换行符
  12. 济南铃木UU125无破线改装仪表盘详解
  13. Origin中输入希腊字母
  14. JAVA泛型实例化代码
  15. DevTools failed to load SourceMap Could not load content 控制台显示的这个警告是什么意思
  16. c语言实例 魔术师的猜牌术(1),C语言实例:魔术师的猜牌术(2)
  17. 2023美国大学生数学建模竞赛Y题思路解析
  18. AVR系列单片机的基本架构(翻译自俄语讲义)
  19. misc方向题型总结
  20. Telerik 2023 R1 Progress Developer -Retail

热门文章

  1. Java程序占用 CPU 过高怎么排查
  2. 爬去东方财富网龙虎榜(wechat:15353378609)
  3. 【阅读笔记】《CFUN: Combining Faster R-CNN and U-net Network for Efficient Whole Heart Segmentation》
  4. 人类高质量程序员电脑配置(持续更新)
  5. 振作起来,开始认真搞了
  6. Android 设备Id 唯一不重复,Redmi
  7. Three.js地球开发—6.三维球面上某点进行贴图标注
  8. mysql 存储树形结构
  9. TMS320F280049C 学习笔记10 控制率加速器 Control Law Accelerator (CLA) 入门
  10. java argument type mismatch_解决mybatisplus插入报错argument type mismatch的问题