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.rhkb.cn/news/156488.html

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

相关文章

泛微低代码平台应用合集,开箱即用,助力组织快速数字化

随着数字化进程的不断深入&#xff0c;各行业对数字化转型的认知不断加深&#xff0c;组织数字化的步伐越来越快。 数字化对组织创新能力加强、生产效率提升、运营成本下降等方面有显著成效&#xff0c;但是组织数字化转型之路面临不少挑战&#xff1a; 数字化挑战 1、数字化…

接口自动化测试 —— 协议、请求流程

一、架构 CRM客户关系管理系统 SAAS Software As A Service 软件即服务 PAAS Platform AS A Service 平台即服务 快速交付→ 快&#xff1a;自己去干、有结果、事事有回音、持续改进 单体架构——》垂直架构——》面向服务架构——》微服务架构&#xff08;分布式&#xf…

【JVM系列】- 启航·JVM概论学习

启航JVM概论 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c…

软件测试/测试开发/校招推荐 |中科创达软件股份有限公司岗位开放

黑盒测试工程师 岗位职责 制定测试计划、测试策略&#xff0c;设计测试用例&#xff1b; 软件需求评审与分析&#xff1b; 依据测试计划执行软件测试&#xff1b; 提交并维护软件缺陷&#xff1b; 准备测试报告并提交批准以及测试总结&#xff1b; 分析与制定疑难测试问题…

通讯网关软件019——利用CommGate X2OPCUA实现OPC UA访问Oracle服务器

本文介绍利用CommGate X2OPCUA实现OPC UA访问ORACLE数据库。CommGate X2OPCUA是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过OPC UA来获取ORACLE数据库的数据。 【解决方案】…

网络模型之OSI七层网络模型、TCP/IP四层网络模型

一、计算机网络是什么&#xff1f; 计算机网络是指由通讯网络相互连接的许多自主工作的计算机构成的集合体。 二、网络模型是干什么的&#xff1f; 网络模型就是研究计算机网络中各个部件是以何种规则进行通行。 三、OSI七层网络模型 OSI 是 Open System Interconnection 的…

《理解深度学习》2023最新版本+习题答案册pdf

刚入门深度学习或者觉得学起来很困难的同学看过来了&#xff0c;今天分享的这本深度学习教科书绝对适合你。 就是这本已在外网获13.1万次下载的宝藏教科书《理解深度学习》。本书由巴斯大学计算机科学教授Simon J.D. Prince撰写&#xff0c;全书共541页&#xff0c;目前共有21…

【Unity】【VR】如何让Distance Grab抓取物品时限制物品的Rotation

【背景】 遇到这样的场景,希望抓取Canvas时,Canvas不会沿Z轴旋转。 【问题】 发现Freeze Canvas的Rigid Body没有用。 【分析】 应该是RigidBody的限制仅在物理互动下生效,抓取可能不属于物理互动(比如碰撞),所以不生效。 【思路】 还是得写脚本挂载在Interacta…

初学vue,想自己找个中长期小型项目练练手,应该做什么?

前言 可以试着做一两个完整的后台管理项目后再去做其他的&#xff0c;下面推荐一些github上的vue后台管理的项目&#xff0c;可以自己选择性的练一下手 Vue2 1、iview-admin Star: 16.4k 基于 iview组件库开发的一款后台管理系统框架&#xff0c;提供了一系列的强大组件和基…

解决github加载过慢问题

github打不开怎么办&#xff1f;看到这篇文章&#xff0c;一切都稳了&#xff01; DNS被污染&#xff0c;一句话&#xff0c;修改系统hosts文件&#xff01; 1.hosts文件在哪&#xff1f;C:\Windows\System32\drivers\etc 2.用记事本打开hosts&#xff0c;在最后加入以下两行…

入手DDR5内存最佳时机到了,价格大跳水香过DDR4

当时 DDR5 内存刚出来那会儿大家怎么说的来着&#xff0c;售价离谱&#xff0c;提升微弱&#xff0c;鬼都不买… 不过嘛&#xff0c;随着 13 代酷睿以及锐龙 7000 系 CPU 上市&#xff0c;DDR5 彻底真香起来了。 先不说花重金升级 13 代酷睿平台&#xff0c;还用 DDR4 会不会有…

神秘的锦衣卫

在看明朝电视剧经常听到的一句台词&#xff1a;锦衣卫办案&#xff0c;闲杂人等速速离开。锦衣卫是明朝特务机构&#xff0c;直接听命于皇帝&#xff0c;是亲军卫之一&#xff0c;也是最重要的一卫。 1、卫所制 卫所制是明代最主要的军事制度&#xff0c;其目标是寓兵于农、屯…

程序员如何用海外平台接单?

作为一名能力超群的码农&#xff0c;基本工资肯定是到位的。 那你是否想过锦上添花&#xff0c;试着找找兼职呢&#xff1f; 相信不少人已经在接单平台上接单了&#xff0c; 但是&#xff0c;在众多接单平台中&#xff0c;海外平台是个什么样的存在呢&#xff1f;怎么在海外…

动画圆圈文字标志效果

效果展示 CSS 知识点 实现圆圈文字animation 属性回顾 实现思路 从效果的实现思路很简单&#xff0c;其实就是两个圆圈就可以实现。外层大圆&#xff08;灰色&#xff09;用于圆圈文字的展示&#xff0c;而内圆&#xff08;藏青色&#xff09;主要用于存放 Logo 图片。布局采…

【Android平板编程】远程Ubuntu服务器code-server编程写代码

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

前端笔记:Create React App 初始化项目的几个关键文件解读

1 介绍 Create React App 是一个官方支持的方式&#xff0c;用于创建单页应用的 React 设置用于构建用户界面的 JAVASCRIPT 库主要用于构建 UI 2 项目结构 一个典型的 Create React App 项目结构如下&#xff1a; ├── package.json ├── public # 这…

uniapp物理键/右滑多次退出应用,再次进入显示白屏的问题

复现方式&#xff1a;安卓多次使用物理返回键或右滑退出应用后&#xff0c; 再次进入有很大机率显示白屏。但是手动杀进程的方式不会出现白屏和后台驻留的方式也不会出现白屏 解决思路&#xff1a;利用后台驻留的方式进行假退出应用&#xff0c;把应用隐藏至后台&#xff0c;这…

RabbitMQ消息中间件概述

1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue &#xff09;的开源实现。AMQP 的出现其实也是应了广大人民群众的需求&#xff0c;虽然在同步消息通讯的世界里有很多公开标准&#xff08;如 COBAR的 IIOP &#xff0c;或者是 SOAP 等&…

漏刻有时数据可视化大屏(16)数据指标KPI和柱图折线图混排

CSS样式表 /*面板*/ .pannel {width: 100%;margin-top: 30px;clear: both; }.item_l {float: left;width: 20%; /*3格60%*/margin: 0; }.item_r {float: left;width: 10%; /*4格40%*/margin: 0; }.item_child {float: left;width: 50%; }.item_child_b {float: left;width: 10…

【算法-动态规划】贝尔曼福特算法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…