第25章 JDBC核心技术第4节:操作BLOB类型字段

zz/2024/6/13 21:58:28

4.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服务。

4.2 向数据表中插入大数据类型

PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOB大文本类型和BLOB大二进制数据类型。

有以下方法可用于流式传输数据
setAsciiStream():此方法用于提供大的ASCII值。
setCharacterStream():此方法用于提供较大的UNICODE值。
setBinaryStream():此方法用于提供较大的二进制值。
setXXXStream()方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。需要说明的是:图片在项目的存储:专门的图片服务器,整个服务器存储都是图片, 华为云服务器,购买华为云服务器可以直接使用, 提供一套API,我们调用这些API就可以存储到华为云,存储成功之后返回一个HTTP地址,可以通过http访问整个图片.当然阿里云也有类似的存储.业界里还有一个公司提供存储服务器,七牛云,提供存储服务,特别是图片服务器.

//获取连接
Connection conn = JDBCUtils.getConnection();	
String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符
ps.setString(1, "徐海强");
ps.setString(2, "xhq@126.com");
ps.setDate(3, new Date(new java.util.Date().getTime()));
// 操作Blob类型的变量
FileInputStream fis = new FileInputStream("xhq.png");
ps.setBlob(4, fis);
//执行
ps.execute();
fis.close();
JDBCUtils.closeResource(conn, ps);

4.3 修改数据表中的Blob类型字段

Connection conn = JDBCUtils.getConnection();
String sql = "update customers set photo = ? where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符
// 操作Blob类型的变量
FileInputStream fis = new FileInputStream("coffee.png");
ps.setBlob(1, fis);
ps.setInt(2, 25);
ps.execute();
fis.close();
JDBCUtils.closeResource(conn, ps);

4.4 从数据表中读取大数据类型

String sql = "SELECT id, name, email, birth, photo FROM customer WHERE id = ?";
conn = getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, 8);
rs = ps.executeQuery();
if(rs.next()){Integer id = rs.getInt(1);String name = rs.getString(2);String email = rs.getString(3);Date birth = rs.getDate(4);Customer cust = new Customer(id, name, email, birth);System.out.println(cust); //读取Blob类型的字段Blob photo = rs.getBlob(5);InputStream is = photo.getBinaryStream();OutputStream os = new FileOutputStream("c.jpg");byte [] buffer = new byte[1024];int len = 0;while((len = is.read(buffer)) != -1){os.write(buffer, 0, len);}JDBCUtils.closeResource(conn, ps, rs);	if(is != null){is.close();}if(os !=  null){os.close();}
}

4.5 操作大文本对象

//读取大文本数据,了解知识
public static void readCLOB() {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;String sql="select * from student where s_id=?";try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, "11");rs = pstmt.executeQuery();if(rs.next()) {String sname = rs.getString("s_name");String sid = rs.getString(1);Date sbirth = rs.getDate("s_birth");System.out.println(sid+"\t"+sname+"\t"+sbirth);Reader reader = rs.getCharacterStream("s_resume");//保存读取到数据FileWriter writer = new FileWriter("d:\\test.txt");char [] txt = new char[1024];int len = 0;while(  (len=reader.read(txt))!= -1 ) {writer.write(txt, 0, len);}writer.close();reader.close();}} catch (Exception e) {e.printStackTrace();}finally {DBUtil.closeAll(null, pstmt, conn);}
}
//存储大文本数据,了解知识
public static void saveCLOB() {Connection conn = null;PreparedStatement pstmt = null;String sql="update student set s_resume=? where s_id=?";try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);//根据提供的文件创建输入流FileReader reader  =new FileReader("d:\\data.txt");pstmt.setCharacterStream(1, reader);pstmt.setString(2, "11");int rows = pstmt.executeUpdate();if (rows>0) {System.out.println("操作成功");} else {System.out.println("操作失败");}} catch (SQLException | FileNotFoundException e) {e.printStackTrace();}finally {DBUtil.closeAll(null, pstmt, conn);}
}

http://www.ngui.cc/zz/2390159.html

相关文章

Java学习个人总结

声明:个人原创,转载请在文章开头明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10063960.html 学习从来都是一个阶段的学习,然后进行整理与总结,最后才能形成自己的东西,今天将最近所学习的内容…

(翻译自用)TG^2———IJDAR杂志论文

TG2: 用于恢复文档可读性和感知质量的文本引导转换器GAN 摘要 大多数侧重于数字化文本文档恢复的图像增强方法仅限于文本信息仍保留在输入图像中的情况,而这种情况可能通常不是这样。在这项工作中,我们提出了一种新的生成性文档恢复方法,该…

基于Kubernetes/K8S构建Jenkins持续集成平台(一)

目录 Kubernetes实现Master-Slave分布式构建方案 传统Jenkins的Master-Slave方案的缺陷 KubernatesDockerJenkins持续集成架构图 KubernatesDockerJenkins持续集成方案好处 NFS简介 在Kubernetes安装Jenkins-Master 创建nfs-client-rbac 创建NFS client provisioner 创建 nfs…

中国汽水制造商市场趋势报告、技术动态创新及市场预测

汽水制造商市场的企业竞争态势 该报告涉及的主要国际市场参与者有SodaStream、Bonne、Flavorstation、Hamilton Beach、Drinkmate、iSODA、Cuisinart、Delight、Fizz Giz、Frostte、Jaybrake、KitchenAid、KOBWA、Leegoal、Lourdes、Lucky Sports、New、Primo Flavorstation、S…

mysql日志备份命令是什么_mysql的常用命令以及备份和恢复

首先建立一个计划并严格遵守,定期实施备份。让服务器执行更新日志。当你在崩溃后需要恢复数据时,更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后,你可以通过运行更新日志中的查询再次运用备份后面的修改,这将数据库中…

数据结构线性表(1)

顺序表C语言代码实现 实验要求:编写一个头文件SqList.h,实现顺序表的各种基本操作,并在此基础上设计一个主程序(exp2_1.cpp)完成如下功能: (1) 初始化顺序表L (2&#xf…

chromium浏览器开发系列第一篇:如何获取最新chromium源码

背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧。于是乎,本文顺理成章。由于有些细节必需描述清楚,所以这次先讲如何拿到…

中文域名,网站,启用,弘勇,xn--2gr99z.xn--fiqs8s,网址,中国,

下面这些网站是中文域名网站,中文域名直达网站,用百度要搜索关键词,步骤比较多,输入网址比较快,直达网站。还有一些中文域名网站,签名:游志勇。 弘勇.中国, xn–2gr99z.xn–fiqs8s …

仿新浪微博2014之登陆界面四(总体功能)

在前面完成了数据库操作、异步图片加载和缓存、新浪微博认证后,就可以进行登录界面的功能开发了,登录界面功能代码如下: package com.xhq.xweibo.ui;import java.util.ArrayList; import java.util.List;import com.sina.weibo.sdk.auth.Oau…

发一个文件读写类

<?php /* * author:xhq * email:xhq6632126.com * QQ:119948717 */ header("Content-type: text/html; charsetutf-8");class filesystem {/*名称&#xff1a;创建文件参数&#xff1a;文件名&#xff0c;写入的数据&#xff0c;模式*/function writefile($file,…