JDBC-day03(BLOB类型字段,批量插入)

四:操作BLOB类型字段

1.MySQL BLOB类型

  • 在MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。可以用来存储图片,视频等

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

  • MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
    在这里插入图片描述

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

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

2.向数据表customer中插入Blob类型的字段

public class BlobTest {@Testpublic void testInsert() throws Exception {Connection conn = null;                          PreparedStatement ps = null;try {conn = JDBC_Utils.getConnection();String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";ps = conn.prepareStatement(sql);ps.setObject(1, "张杰");ps.setObject(2, "ZhangJie@168.com");ps.setObject(3, "1992-09-08");FileInputStream is = new FileInputStream(new File("zhangjie.jpg"));//如果文件大于1MB,可能会报xxx too large错误,解决方法参照上面的解决方式ps.setBlob(4, is);ps.execute();} catch (Exception e) {e.printStackTrace();}finally {JDBC_Utils.closeResource(conn, ps);}}
}

注:在工作目录下要有zhangjie.jpg,否则会提示找不到文件

3.查询数据表customer中的Blob字段

	@Testpublic void testQuery(){Connection conn = null;      PreparedStatement ps = null;ResultSet rs = null; InputStream is = null;FileOutputStream fos = null;try { conn = JDBC_Utils.getConnection();String sql = "select id,name,email,birth,photo from customers where id = ?"; ps = conn.prepareStatement(sql);ps.setInt(1,21);rs = ps.executeQuery(); if(rs.next()) { //使用列的别名来查找int id = rs.getInt("id");String name = rs.getString("name");String email = rs.getString("email"); Date birth = rs.getDate("birth");Customer customer = new Customer(id,name,email,birth);System.out.println(customer); //将Blob类型的字段下载下来,以文件的形式保留到本地Blob photo = rs.getBlob("photo");is = photo.getBinaryStream();fos = new FileOutputStream("singer.jpg");byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len);}}} catch (Exception e) {e.printStackTrace();}finally {try { if(is != null) is.close(); } catch (IOException e) {e.printStackTrace();}try { if(fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}JDBC_Utils.closeResource(conn, ps, rs); }}

五:批量插入

1.批量操作

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

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

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch():执行批量处理语句;
  • clearBatch():清空缓存的数据

通常我们会遇到两种批量执行SQL语句的情况:

  • 多条SQL语句的批量处理;
  • 一个SQL语句的批量传参;

2.高效的批量插入

  • 使用PreparedStatement实现批量数据操作
  • update,delete本身就具有批量操作的效果
  • 此时的批量操作,主要指批量插入

例: 题目向goods表添加100万条数据

 CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,       NAME VARCHAR(25)
);
import java.sql.Connection;                                      
import java.sql.PreparedStatement;import org.junit.Test;import com.jdbc.util.JDBC_Utils;public class InsertTest {//方式一:使用Statement批量插入数据(略)//方式二:使用PreparedStatement批量插入数据@Testpublic void testInsert1() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBC_Utils.getConnection();String sql = "insert into goods(name)values(?)";ps = conn.prepareStatement(sql);for(int i = 1;i <= 1000000;i++) {ps.setObject(1,"name_" + i);ps.execute();}long end = System.currentTimeMillis();System.out.println("插入花费时间为:" + (end - start) + "毫秒");//1350941毫秒---8473毫秒---5857毫秒} catch (Exception e) {e.printStackTrace();}finally {JDBC_Utils.closeResource(conn, ps);}	}
}

方式三:使用addBatch(),executeBatch(),clearBatch()批量插入数据

  • mysql服务器默认关闭批处理,需要通过在url后添加?rewriteBatchedStatements=true来进行开启,不是mysqld的配置文件,是数据库连接的配置文件,即jdbc.properties

  • mysql驱动需要5.1.37及以上版本

    @Test
    public void testInsert2() {Connection conn = null;                                                        PreparedStatement ps = null;try { long start = System.currentTimeMillis();conn = JDBC_Utils.getConnection();String sql = "insert into goods(name)values(?)"; ps = conn.prepareStatement(sql);for(int i = 1;i <= 1000000;i++) {ps.setObject(1,"name_" + i);//1."攒"SQLps.addBatch();if(i % 500 == 0) {//2.执行batchps.executeBatch();//3.清空batchps.clearBatch(); }}long end = System.currentTimeMillis();System.out.println("插入花费时间为:" + (end - start) + "毫秒");} catch (Exception e) {e.printStackTrace();}finally {JDBC_Utils.closeResource(conn, ps);}
    }

方式四:设置连接不允许自动提交数据

	@Testpublic void testInsert3() {Connection conn = null;          PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBC_Utils.getConnection();//设置不允许自动提交,默认执行SQL,就自动提交到数据库conn.setAutoCommit(false);String sql = "insert into goods(name)values(?)";ps = conn.prepareStatement(sql);for(int i = 1;i <= 1000000;i++) {ps.setObject(1,"name_" + i);//1."攒"SQLps.addBatch();if(i % 500 == 0) {//2.执行batchps.executeBatch();//3.清空batchps.clearBatch();}}//提交数据conn.commit();long end = System.currentTimeMillis();System.out.println("插入花费时间为:" + (end - start) + "毫秒");} catch (Exception e) {e.printStackTrace();}finally {JDBC_Utils.closeResource(conn, ps);}}

其中可能会出现不少的小问题,请多多包含
感谢大家的支持,关注,评论,点赞!
参考资料:尚硅谷_宋红康_JDBC核心技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/130359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA的使用(三)Debug(断点调试)(IntelliJ IDEA 2022.1.3版本)

编程过程中如果出现错误&#xff0c;需要查找和定位错误时&#xff0c;借助程序调试可以快速查找错误。 编写好程序后&#xff0c;可能出现的情况&#xff1a; 1.没有bug。 使用Debug的情况&#xff1a; 2.运行后&#xff0c;出现错误或者异常信息&#xff0c;但是通过日志文件…

Hadoop----Azkaban的使用与一些报错问题的解决

1.因为官方只放出源码&#xff0c;并没有放出其tar包&#xff0c;所以需要我们自己编译&#xff0c;通过查阅资料我们可以使用gradlew对其进行编译&#xff0c;还是比较简单&#xff0c;然后将里面需要用到的服务文件夹进行拷贝&#xff0c;完善其文件夹结构&#xff0c;通常会…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)

一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式&#xff0c;手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录&#xff0c;HarmonyOS…

【【萌新的SOC学习之AXI接口简介】】

萌新的SOC学习之AXI接口简介 AXI总线的初步介绍 AXI 总线是 ARM AMBA 一部分 &#xff08;高级可扩展接口&#xff09; AMBA(高级微控制器总线架构&#xff09; &#xff1a;开放的片内互联的总线标准&#xff0c;能再多主机设计中实现多个控制器和外围设备之间的连接和管理。…

PL2303驱动程序不支持WINDOWS 11及后续版本

到网上下载PL2303的驱动程序, 双击安装这个驱动程序&#xff0c;安装完成后双击这个端口&#xff0c; 这个端口的驱动程序是我们刚才安装的&#xff0c;选中 点击下一步&#xff0c;问题解决。如下图已经没有之前的提示了

服务器数据恢复-VMWARE ESX SERVER虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 几台VMware ESX SERVER共享一台某品牌存储&#xff0c;共有几十组虚拟机。 服务器故障&#xff1a; 虚拟机在工作过程中突然被发现不可用&#xff0c;管理员将设备进行了重启&#xff0c;重启后虚拟机依然不可用&#xff0c;虚拟磁盘丢失&#…

加密市场波动:地缘政治与美股走弱引发不确定性!

伴随着国庆假期的结束&#xff0c;多日波动率维持低位的加密市场也似乎开始苏醒。近期多次突破28000美元未果的比特币&#xff0c;于9日15:00开始从27800美元附近下跌&#xff0c;最低跌至27260美元&#xff0c;同期以太坊也至1550美元左右&#xff0c;创近半个月来新低。 Coin…

Can 通信-协议

概述 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种各样的电子控制系统 被开发了出来。由于…

Spring中shutdown hook作用

在Spring框架中&#xff0c;Shutdown Hook&#xff08;关闭钩子&#xff09;是一种机制&#xff0c;用于在应用程序关闭时执行一些清理操作Spring会向JVM注册一个shutdown hook&#xff0c;在接收到关闭通知的时候&#xff0c;进行bean的销毁&#xff0c;容器的销毁处理等操作在…

林沛满-TCP 是如何避免被发送方分片的?

TCP 可以避免被发送方分片&#xff0c;是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS&#xff08;Maximum Segment Size&#xff09;&#xff0c;它相当于把 MTU 刨去 IP头和 TCP 头之后的大小&#xff0c;所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …

通过位运算,实现单字段标识多个状态位

可能经常有如下这种需求: 需要一张表,来记录学员课程的通过与否. 课程数量不确定,往往很多,且会有变动,随时可能新增一门课. 这种情况下,在设计表结构时,一门课对应一个字段,就有些不合适, 因为不知道课程的具体数量,也无法应对后期课程的增加. 考虑只用一个状态标志位,利用位运…

Oracle笔记-对ROWNUM的一次理解(简单分页)

此博文记录时间&#xff1a;2023-05-05&#xff0c;发到互联网上是2023-10-09 这个在分页里面用得比较多&#xff0c;在MySQL中&#xff0c;通常使用limit去操作&#xff0c;而去感觉比较简单&#xff0c;Oracle中无此关键字。 通过查阅资料后&#xff0c;要实现分页需要用到…