第25章 JDBC核心技术第4节:操作BLOB类型字段
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);}
}
第25章 JDBC核心技术第4节:操作BLOB类型字段相关推荐
- 第25章 JDBC核心技术第3节
第3节:实现CRUD操作 3.1 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一个Socket连接. 在 java.s ...
- JDBC:软件架构、概述、数据库连接:普通项目添加jar包,URL、sql注入,类型转换,查询流程表、操作BLOB类型字段、批量插入,替换jar包、事务/数据库连接池
0 常识说明 0.1 软件架构方式介绍 B/S架构:浏览器 与 服务器之间的交互. C/S架构:安装的本地软件(如:今日头条等) 与 服务器进行交互. 0.2 JavaWeb技术概览 JDBC核心技术 ...
- JDBC详解(四):操作BLOB类型字段(超详解)
JDBC详解(四):操作BLOB类型字段 前言 一.MySQL BLOB类型 二.向数据表中插入大数据类型 三.修改数据表中的Blob类型字段 四.从数据表中读取大数据类型 前言 本博主将用CSDN记 ...
- JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD
JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...
- jdbc之操作BLOB类型字段
MySQL BLOB类型 MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据. 插入BLOB类型的数据必须使用PreparedStatement,因为BL ...
- JDBC四:操作Blob类型字段
操作Blob类型字段 向数据表中插入Blob类型的字段 Blobl类型的字段是一个文件,文件的传输需要进行IO流操作 @Testpublic void testBlob() {Connection c ...
- 【云原生进阶之容器】第一章Docker核心技术1.6节——UnionFS
<重识云原生系列>专题各章首节索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第三章云存储第1节--分布式云存储总述 第四章云网络第一节--云网络技术发展简 ...
- 【云原生进阶之容器】第一章Docker核心技术1.1节——Docker综述
1 Docker简述 1.1 什么是Docker Docker是一个开源的软件项目,让用户程序部署在一个相对隔离的环境运行,借此在Linux操作系统上提供一层额外的抽象,以及操作系统层虚拟化的自动管理 ...
- 深入浅出JDBC核心技术
文章目录 JDBC核心技术--课程笔记 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的数据存储技术 1.3 JDBC介绍 1.4 JDBC体系结构 1.5 JDBC程序编写步骤 第2 ...
最新文章
- lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器
- Linux 初始化脚本 (centos6 centos7 通用)
- 【git】----- clone 及上传文件
- bootstrap-table 行合并和列合并,以及固定列宽度等问题
- 在python3中如何加载静态文件详版步骤
- 用Java控制小电灯-树莓派PI4J
- 不到三千买iPhone12 网友:抢到算我输
- 【白皮书分享】快手私域经营白皮书.pdf(附下载链接)
- wps计算机一级考试提纲,2017计算机一级考试大纲:WPS Office (汇总)
- linux下 环境搭建教程,Linux环境下搭建pNFS使用环境教程
- fdisk、parted无损调整普通分区大小
- VS编译报错Error2019
- EasyUI:Parser 解析器
- python中字符编码:coding utf-8, unicde, defaultencoding, UnicodeDecodeError, UnicodeEncodeError
- 斯坦福大学自然语言处理第五课“拼写纠错(Spelling Correction)”
- java进度条_Java实现进度条开发过程
- html添加购买按钮,萤火小程序商城给前端和商品组件增加“购买”按钮的方法...
- win10禁用笔记本键盘
- Arduino Uno + PAJ7620U2 实现手势识别控制LED灯工作
- Ubuntu下ping命令提示域名解析失败以及无法打开网页