• JDBC进行批量插入数据操作


    目录

    1.方式一:使用PreparedStatement

    2.方式二:使用addBatch(),excuteBatch(),clearBatch()

    3.方式三:设置不允许自动提交数据

    4.总结


    1.方式一:使用PreparedStatement

    步骤

    ①获取连接。

    ②编写SQL语句。

    ③预编译SQL语句。

    ④填充占位符。

    ⑤执行SQL语句。

    实例:创建数据表并包含一个int类型字段userid,并向其中添加2万条数据。

    1. package lib;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.sql.Connection;
    5. import java.sql.DriverManager;
    6. import java.sql.PreparedStatement;
    7. import java.sql.SQLException;
    8. import java.util.Properties;
    9. public class Test2 {
    10. public static void main(String []args) {
    11. InputStream is = null;
    12. Connection connection = null;
    13. try {
    14. //获取连接
    15. is = Test2.class.getClassLoader().getResourceAsStream("test.properties");
    16. Properties properties=new Properties();
    17. properties.load(is);
    18. String user=properties.getProperty("user");
    19. String password=properties.getProperty("password");
    20. String url=properties.getProperty("url");
    21. String driver=properties.getProperty("driver");
    22. Class.forName(driver);
    23. connection = DriverManager.getConnection(url, user, password);
    24. //删除旧表
    25. String sql="drop table test";
    26. PreparedStatement ps=connection.prepareStatement(sql);
    27. ps.execute();
    28. //创建新表
    29. sql="create table test (userid int)";
    30. ps=connection.prepareStatement(sql);
    31. ps.execute();
    32. //插入数据
    33. sql="insert into test values (?)";
    34. ps=connection.prepareStatement(sql);
    35. for(int i=1;i<=20000;i++) {
    36. ps.setObject(1, i);
    37. ps.execute();
    38. }
    39. } catch (Exception e) {
    40. e.printStackTrace();
    41. }
    42. //资源关闭
    43. try {
    44. connection.close();
    45. } catch (SQLException e) {
    46. e.printStackTrace();
    47. }
    48. try {
    49. is.close();
    50. } catch (IOException e) {
    51. e.printStackTrace();
    52. }
    53. }
    54. }

    2.方式二:使用addBatch(),excuteBatch(),clearBatch()

    步骤

    ①获取连接。

    ②编写sq语句。

    ③预编译SQL语句。

    ④填充占位符。

    ⑤调用PreparedStatement对象的addBatch()攒SQL语句。

    ⑥调用PreparedStatement对象的excuteBatch()执行SQL语句。

    ⑦调用PreparedStatement对象的clearBatch()清空Batch。

    注意点:

    ①上面的三个函数作用分别是:攒SQL语句、执行SQL语句、清空SQL语句。

    ②MySQL服务器默认是关闭批处理的,需要设置一个参数使MySQL支持批处理操作。做法:在配置文件中URL后面加上:?rewriteBatchedStatements=true

    实例:同上

    1. package lib;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.sql.Connection;
    5. import java.sql.DriverManager;
    6. import java.sql.PreparedStatement;
    7. import java.sql.SQLException;
    8. import java.util.Properties;
    9. public class Test2 {
    10. public static void main(String []args) {
    11. InputStream is = null;
    12. Connection connection = null;
    13. try {
    14. //获取连接
    15. is = Test2.class.getClassLoader().getResourceAsStream("test.properties");
    16. Properties properties=new Properties();
    17. properties.load(is);
    18. String user=properties.getProperty("user");
    19. String password=properties.getProperty("password");
    20. String url=properties.getProperty("url");
    21. String driver=properties.getProperty("driver");
    22. Class.forName(driver);
    23. connection = DriverManager.getConnection(url, user, password);
    24. //删除旧表
    25. String sql="drop table test";
    26. PreparedStatement ps=connection.prepareStatement(sql);
    27. ps.execute();
    28. //创建新表
    29. sql="create table test (userid int)";
    30. ps=connection.prepareStatement(sql);
    31. ps.execute();
    32. //插入数据
    33. sql="insert into test values (?)";
    34. ps=connection.prepareStatement(sql);
    35. for(int i=1;i<=20000;i++) {
    36. ps.setObject(1, i);
    37. //攒SQL语句
    38. ps.addBatch();
    39. if(i%500==0) {
    40. //执行SQL语句
    41. ps.executeBatch();
    42. //清空SQL语句
    43. ps.clearBatch();
    44. }
    45. }
    46. } catch (Exception e) {
    47. e.printStackTrace();
    48. }
    49. //资源关闭
    50. try {
    51. connection.close();
    52. } catch (SQLException e) {
    53. e.printStackTrace();
    54. }
    55. try {
    56. is.close();
    57. } catch (IOException e) {
    58. e.printStackTrace();
    59. }
    60. }
    61. }

    3.方式三:设置不允许自动提交数据

    步骤

    同方式二,不过在获取连接之后要先调用Connection对象的setAutoCommit()方法将数据库的自动提交功能进行关闭,然后再所有数据写入完成以后再调用Connection对象的commit()方法来将数据进行统一提交

    实例:同上

    1. package lib;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.sql.Connection;
    5. import java.sql.DriverManager;
    6. import java.sql.PreparedStatement;
    7. import java.sql.SQLException;
    8. import java.util.Properties;
    9. public class Test2 {
    10. public static void main(String []args) {
    11. InputStream is = null;
    12. Connection connection = null;
    13. try {
    14. //获取连接
    15. is = Test2.class.getClassLoader().getResourceAsStream("test.properties");
    16. Properties properties=new Properties();
    17. properties.load(is);
    18. String user=properties.getProperty("user");
    19. String password=properties.getProperty("password");
    20. String url=properties.getProperty("url");
    21. String driver=properties.getProperty("driver");
    22. Class.forName(driver);
    23. connection = DriverManager.getConnection(url, user, password);
    24. //关闭自动提交
    25. connection.setAutoCommit(false);
    26. //删除旧表
    27. String sql="drop table test";
    28. PreparedStatement ps=connection.prepareStatement(sql);
    29. ps.execute();
    30. //创建新表
    31. sql="create table test (userid int)";
    32. ps=connection.prepareStatement(sql);
    33. ps.execute();
    34. //插入数据
    35. sql="insert into test values (?)";
    36. ps=connection.prepareStatement(sql);
    37. long time=System.currentTimeMillis();
    38. for(int i=1;i<=1000000;i++) {
    39. ps.setObject(1, i);
    40. //攒SQL语句
    41. ps.addBatch();
    42. if(i%500==0) {
    43. //执行SQL语句
    44. ps.executeBatch();
    45. //清空SQL语句
    46. ps.clearBatch();
    47. }
    48. //提交数据
    49. if(i==1000000) {
    50. connection.commit();
    51. //恢复自动提交
    52. connection.setAutoCommit(true);
    53. }
    54. }
    55. System.out.println(System.currentTimeMillis()-time);
    56. } catch (Exception e) {
    57. e.printStackTrace();
    58. }
    59. //资源关闭
    60. try {
    61. connection.close();
    62. } catch (SQLException e) {
    63. e.printStackTrace();
    64. }
    65. try {
    66. is.close();
    67. } catch (IOException e) {
    68. e.printStackTrace();
    69. }
    70. }
    71. }

    4.总结

    其实方式一前面还有一种方式是使用Statement类来进行批处理,但是由于PreparedStatement会进行预编译SQL语句,之后只要填充占位符即可,不用每次插入数据都进行SQL语句的声明,减少了内存开销和时间花费

    在方式二中,使用addBatch()、excuteBatch()、clearBatch()三个方法来对SQL语句进行“攒起来”的操作,攒够一定量后再进行插入,减少了与数据库之间的交互次数,减少了插入的时间,提高效率。

    方式三中,在获取连接以后,关闭数据库的自动提交功能,在最后一次添加数据后再将所有数据进行统一提交,减少了数据提交的次数,进而减少提交数据的时间,提高了效率。

  • 相关阅读:
    【EI会议征稿】第五届人工智能、网络与信息技术国际学术会议(AINIT 2024)
    [每周一更]-(第67期):docker-compose 部署php的laravel项目
    3分钟搞懂Python第三方库-tqdm使用
    asp.net心理健康管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目
    【编程题】【Scratch二级】2022.03 跳跃游戏
    2171. 拿出最少数目的魔法豆-快速排序+前缀和
    爆肝整理,Jmeter接口性能测试-跨线程调用变量实操(超详细)
    计算机网络之物理层
    Ubuntu18.04 安装完成后的开发配置
    如何在 Spring Boot 中进行数据备份
  • 原文地址:https://blog.csdn.net/m0_71987537/article/details/125599076