• 操作BLOB类型的字段及高效的批量插入操作


    目录

    一、操作BLOB类型的字段

    MySQL中的BLOB类型字段

    插入BLOB类型数据

    查询BOLB类型数据

    二、批量插入

    批量执行SQL语句

    高效的批量插入:


    一、操作BLOB类型的字段

    MySQL中的BLOB类型字段

    MySQL中,BLOB是一个二进制大型对象,是一个存储大量数据的容器,它能容纳不同大型的数据

    插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的

    MySQL的四种BLOB类型:

    1、TingyBlob。最大存放255B

    2、Blob,最大存放65KB

    3、MediumBlob,最大存放16MB

    4、LongBlob,最大存放4GB

    实际使用中根据需要存入的数据大小定义不同的BLOB类型

    需要注意的是:如果存储的文件过大,数据库的性能会下降

    如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数:max_allowed_packet=16M,同时注意:修改了my.ini文件之后,需要重新启动MySQL服务

    插入BLOB类型数据

    1. //获取连接
    2. Connection conn = JDBCUtils.getConnection();
    3. String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
    4. PreparedStatement ps = conn.prepareStatement(sql);
    5. //填充占位符
    6. ps.setString(1, "韩立人");
    7. ps.setString(2, "hlr@126.com");
    8. ps.setDate(3, new Date(new java.util.Date().getTime()));
    9. //操作Blob类型的变量
    10. FileInputStream fis = new FileInputStream("xhq.png");
    11. ps.setBlob(4, fis);
    12. //执行
    13. ps.execute();
    14. fis.close();
    15. JDBCUtils.closeResource(conn, ps)

    查询BOLB类型数据

    1. String sql = "SELECT id, name, email, birth, photo FROM customer WHERE id = ?";
    2. conn = getConnection();
    3. ps = conn.prepareStatement(sql);
    4. ps.setInt(1, 8);
    5. rs = ps.executeQuery();
    6. if(rs.next()){
    7. Integer id = rs.getInt(1);
    8. String name = rs.getString(2);
    9. String email = rs.getString(3);
    10. Date birth = rs.getDate(4);
    11. Customer cust = new Customer(id, name, email, birth);
    12. System.out.println(cust);
    13. //读取Blob类型的字段
    14. Blob photo = rs.getBlob(5);
    15. InputStream is = photo.getBinaryStream();//从查询出来的Blob对象中获取二进制流
    16. OutputStream os = new FileOutputStream("c.jpg");
    17. byte [] buffer = new byte[1024];
    18. int len = 0;
    19. while((len = is.read(buffer)) != -1){
    20. os.write(buffer, 0, len);
    21. }
    22. JDBCUtils.closeResource(conn, ps, rs);
    23. if(is != null){
    24. is.close();
    25. }
    26. if(os != null){
    27. os.close();
    28. }

    二、批量插入

    批量执行SQL语句

    当需要成批插入或者更新记录时,可以采用java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

    JDBC的批量处理语句包括下面三个方法

    1、addBatch(String):添加需要批量处理的SQL语句或是参数

    2、executeBatch():执行批量处理语句

    3、clearBatch():清空缓存的数据

    两种批量执行SQL语句的情况:

    多条SQL语句的批量处理

    一个SQL语句的批量传参

    高效的批量插入:

    方式一:使用Statement

    1. Connection conn = JDBCUtils.getConnection();
    2. Statement st = conn.createStatement();
    3. for(int i = 1;i <= 20000;i++){
    4. String sql = "insert into goods(name) values('name_' + "+ i +")";
    5. st.executeUpdate(sql);
    6. }

    方式二:使用PreparedStatement(比Statement高效)

    1. long start = System.currentTimeMillis();
    2. Connection conn = JDBCUtils.getConnection();
    3. String sql = "insert into goods(name)values(?)";
    4. PreparedStatement ps = conn.prepareStatement(sql);
    5. for(int i = 1;i <= 20000;i++){
    6. ps.setString(1, "name_" + i);
    7. ps.executeUpdate();
    8. }
    9. long end = System.currentTimeMillis();
    10. System.out.println("花费的时间为:" + (end - start));//82340
    11. JDBCUtils.closeResource(conn, ps);

    方式三:使用批量处理语句对方式二优化

    1. public void testInsert1() throws Exception{
    2. long start = System.currentTimeMillis();
    3. Connection conn = JDBCUtils.getConnection();
    4. String sql = "insert into goods(name)values(?)";
    5. PreparedStatement ps = conn.prepareStatement(sql);
    6. for(int i = 1;i <= 1000000;i++){
    7. ps.setString(1, "name_" + i);
    8. //1.“攒”sql
    9. ps.addBatch();
    10. if(i % 500 == 0){
    11. //2.执行
    12. ps.executeBatch();
    13. //3.清空
    14. ps.clearBatch();
    15. }
    16. }
    17. long end = System.currentTimeMillis();
    18. System.out.println("花费的时间为:" + (end - start));//20000条:625
    19. //1000000条:14733
    20. JDBCUtils.closeResource(conn, ps);
    21. }

    方式四:使用Connection的setAutoCommit()方法对方式三优化

    1. public void testInsert2() throws Exception{
    2. long start = System.currentTimeMillis();
    3. Connection conn = JDBCUtils.getConnection();
    4. //1.设置为不自动提交数据
    5. conn.setAutoCommit(false);
    6. String sql = "insert into goods(name)values(?)";
    7. PreparedStatement ps = conn.prepareStatement(sql);
    8. for(int i = 1;i <= 1000000;i++){
    9. ps.setString(1, "name_" + i);
    10. //1.“攒”sql
    11. ps.addBatch();
    12. if(i % 500 == 0){
    13. //2.执行
    14. ps.executeBatch();
    15. //3.清空
    16. ps.clearBatch();
    17. }
    18. }
    19. //2.手动提交数据
    20. conn.commit();
    21. long end = System.currentTimeMillis();
    22. System.out.println("花费的时间为:" + (end - start));//1000000条:4978
    23. JDBCUtils.closeResource(conn, ps);
    24. }
  • 相关阅读:
    APR学习失败问题定位排查
    创新与重塑,佛塑科技打造集团型 CRM 建设标杆
    中国毫米波雷达产业分析1——毫米波雷达行业概述
    行为型模式-迭代器模式
    SAP MM学习笔记36 - 释放支付保留的发票
    Nginx性能优化(超详细)
    【C++】C++从入门到精通教程(持续更新...)
    【答读者问】把Go基础学完后,是学web方向还是区块链方向?
    Flutter.源码分析.flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView
    springboot生成图片并在图片上添加字体进行换行
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/126954320