您可以通过PreparedStatement#addBatch()创build一个批处理,并通过PreparedStatement#executeBatch()执行它。

这是一个开球的例子:

public void save(List entities) throws SQLException { try ( Connection connection = database.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_INSERT); ) { int i = 0; for (Entity entity : entities) { statement.setString(1, entity.getSomeProperty()); // ... statement.addBatch(); i++; if (i % 1000 == 0 || i == entities.size()) { statement.executeBatch(); // Execute every 1000 items. } } } }

每1000个项目执行一次,因为一些JDBC驱动程序和/或DB可能会限制批处理长度。

另见 :

JDBC教程 – 使用PreparedStatement

JDBC教程 – 使用Statement对象进行批量更新

当使用MySQL驱动程序时,必须将连接参数rewriteBatchedStatements设置为true(jdbc:mysql:// localhost:3306 / TestDB? rewriteBatchedStatements = true )。

使用这个参数,当表被locking一次,索引只更新一次时,语句将被重写为批量插入。 所以它快得多。

如果没有这个参数,只能使用更简洁的源代码。

如果您可以dynamic创build您的SQL语句,您可以执行以下解决方法:

String myArray[][] = { { "1-1", "1-2" }, { "2-1", "2-2" }, { "3-1", "3-2" } }; StringBuffer mySql = new StringBuffer( "insert into MyTable (col1, col2) values (?, ?)"); for (int i = 0; i < myArray.length - 1; i++) { mySql.append(", (?, ?)"); } myStatement = myConnection.prepareStatement(mySql.toString()); for (int i = 0; i < myArray.length; i++) { myStatement.setString(i, myArray[i][1]); myStatement.setString(i, myArray[i][2]); } myStatement.executeUpdate();

如果你在表中有自动增量,并且需要访问它,你可以使用下面的方法…在使用之前做testing,因为语句中的getGeneratedKeys(),因为它取决于所使用的驱动程序。 以下代码在Maria DB 10.0.12和Maria JDBC驱动程序1.2上进行了testing

请记住,增加批量大小只会在一定程度上提高性能……对于我的设置,将批量增加到500以上实际上会降低性能。

public Connection getConnection(boolean autoCommit) throws SQLException { Connection conn = dataSource.getConnection(); conn.setAutoCommit(autoCommit); return conn; } private void testBatchInsert(int count, int maxBatchSize) { String querySql = "insert into batch_test(keyword) values(?)"; try { Connection connection = getConnection(false); PreparedStatement pstmt = null; ResultSet rs = null; boolean success = true; int[] executeResult = null; try { pstmt = connection.prepareStatement(querySql, Statement.RETURN_GENERATED_KEYS); for (int i = 0; i < count; i++) { pstmt.setString(1, UUID.randomUUID().toString()); pstmt.addBatch(); if ((i + 1) % maxBatchSize == 0 || (i + 1) == count) { executeResult = pstmt.executeBatch(); } } ResultSet ids = pstmt.getGeneratedKeys(); for (int i = 0; i < executeResult.length; i++) { ids.next(); if (executeResult[i] == 1) { System.out.println("Execute Result: " + i + ", Update Count: " + executeResult[i] + ", id: " + ids.getLong(1)); } } } catch (Exception e) { e.printStackTrace(); success = false; } finally { if (rs != null) { rs.close(); } if (pstmt != null) { pstmt.close(); } if (connection != null) { if (success) { connection.commit(); } else { connection.rollback(); } connection.close(); } } } catch (SQLException e) { e.printStackTrace(); } }

@Ali Shakiba你的代码需要一些修改。 错误部分:

for (int i = 0; i < myArray.length; i++) { myStatement.setString(i, myArray[i][1]); myStatement.setString(i, myArray[i][2]); }

更新的代码:

String myArray[][] = { {"1-1", "1-2"}, {"2-1", "2-2"}, {"3-1", "3-2"} }; StringBuffer mySql = new StringBuffer("insert into MyTable (col1, col2) values (?, ?)"); for (int i = 0; i < myArray.length - 1; i++) { mySql.append(", (?, ?)"); } mysql.append(";"); //also add the terminator at the end of sql statement myStatement = myConnection.prepareStatement(mySql.toString()); for (int i = 0; i < myArray.length; i++) { myStatement.setString((2 * i) + 1, myArray[i][1]); myStatement.setString((2 * i) + 2, myArray[i][2]); } myStatement.executeUpdate();

我们可以在JDBC中一起提交多个更新来提交批量更新。

我们可以使用Statement,PreparedStatement和CallableStatement对象进行bacth更新,并禁用自动提交

addBatch()和executeBatch()函数与所有语句对象一起提供BatchUpdate

这里addBatch()方法将一组语句或参数添加到当前批处理中。

Java添加多行数据到mysql中_Java:使用PreparedStatement将多行插入到MySQL中相关推荐

  1. java里怎么存入数据并进行排序_Java数据结构之排序---插入排序

    插入排序的基本介绍: 插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的. 插入排序的基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素 ...

  2. 在silverlight中通过对话框把选择的图片插入到RichTextBox中

    主要是通过OpenFileDialog打开一个对话框,然后把选择的图片插入到RichTextBox中,具体代码如下 OpenFileDialog open = new OpenFileDialog() ...

  3. mysqldatareader获取整行数据给datarow_SqlDataReader的用法(读取1整行)

    datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条数据;只读:DataReader中的数据是只读的,不能修改;相对地,DataSet中的数据可以任意读取和修改 01.usi ...

  4. java找出一组数据缺少最小数组_Java获取一维数组的最小值实现方法

    编写程序,实现接受用户在文本框中输入的单行数据.这些数据都是整数数字,以空格进行分隔,空格数量不限.并将这些数据分割成一维数组,再从数组中提取最小值显示在界面中.思路是先对用户的输入进行验证,即先用t ...

  5. java 导出excel 大数据量 报错_java导出excel

    上面导出PDF和EXCEL的问题是图片路径出错!!! 数据库中存存的图片路径是"../dishpic/722f464f-3883-42aa-901f-21706da9c582.png&quo ...

  6. MySQL之创建函数,一次性插入表中多行数据

    MySQL之创建函数,一次性插入表中多行数据 一.MySQL之使用存储过程创建函数,一次性插入表中多行数据 一.MySQL之使用存储过程创建函数,一次性插入表中多行数据 #DELIMITER 的使用 ...

  7. ajax上传多行数据及数组循环添加对象

    function pay(collectingCompanyId){var aCount=$("#actualCount").text();var aMoney=$("# ...

  8. excel处置4000行数据卡_【Excel技巧】在Excel中奇偶行提取和奇偶行筛选方法

    今天我给大家讲一个人人都会使用,都能用到的excel教程,那就是在Excel中奇偶行提取和奇偶行筛选方法,以下一共分两部分为大家讲解excel中奇偶行的提取与筛选的方法. 第一.excel偶数行提取 ...

  9. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要: 下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除"表A"中,ID ...

  10. 大数据学习总结+JAVA学习总结+大数据面试+java面试+大数据java异常总结

    文章目录 一.java模块面试问题 1.动态代理 2.浏览器禁用Cookie后的Session处理 3.主从复制的流程[重要] 5.redis的数据类型[重要] 6.Junit测试的注解 7.缓存问题 ...

最新文章

  1. 51nod 1275 连续子段的差异
  2. html插入不规则表格,如何构建HTML表格中的不规则形状?
  3. mdx格式的词典用什么软件打开_视频大神都用什么软件转换视频的格式?
  4. BAT Android面试专题深入探究:四大组件+ViewPager+组件化架构+Bitmap
  5. 面向对象之: 反射和双下方法
  6. 微信小程序获取用户唯一openid,包含java
  7. 2015北京区域赛 Mysterious Antiques in Sackler Museum 几何基础+思维
  8. gRPC编码初探(java)
  9. (蓝桥杯)2018JAVA B组 日志分析
  10. HashMap vs ConcurrentHashMap — 示例及Iterator探秘
  11. 一个简单的动态web服务器
  12. 国际区块链专利统计:蚂蚁、平安、腾讯分列申请数前三名
  13. matlab新建脚本java报错,Matlab(四)脚本的使用
  14. 从SVN资源库下载项目
  15. windows查看usb信息命令_Linux dumpe2fs命令:查看文件系统信息
  16. asp.net 配置 X-Frame-Options
  17. WPF中Mvvm实现类似List的ObservableCollection在WPF中
  18. native2ascii
  19. java统计代码的行数
  20. android支持wifi11ad,WiFi“千兆”必杀,802.11ax/802.11ad标准探秘

热门文章

  1. vivado和modelsim联合仿真实现分频器——2的n次方分频
  2. 前端传递给后端且通过cookie方式,尽量传递id
  3. Spark算子与RDD基本转换
  4. win10 安装msys2 和 ruby
  5. InnoDB中锁的算法(1)
  6. CodeForces - 556C Case of Matryoshkas
  7. Opera 设置微软雅黑字体显示!
  8. [转载] python中try Except抛出异常使用方法
  9. jquery判断自己是父节点的第几个子节点
  10. mssql-sqlserver入门必备知识收集