【JDBC核心】操作 BLOB 类型字段
操作 BLOB 类型字段
MySQL BLOB 类型
- MySQL 中,BLOB 是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
- 插入 BLOB 类型的数据必须使用 PreparedStatement ,因为 BLOB 类型的数据无法使用字符串拼接写的。
- MySQL 的四种 BLOB 类型(除了在存储的最大信息量上不同外,他们是等同的):
- TinyBlob,最大 255 Byte;
- Blob,最大 65 KB;
- MediumBlod,最大 16 MB;
- LongBlod,最大 4 GB。
如果在指定了相关的 Blob 类型以后,还报错:xxx too large
,那么在 mysql 的安装目录下,找 my.ini(my.cnf) 文件加上如下的配置参数: max_allowed_packet=16M。同时注意,修改了 my.ini 文件之后,需要重新启动 mysql 服务。
package cn.parzulpan.jdbc.ch04;
import cn.parzulpan.jdbc.bean.Customer;
import cn.parzulpan.jdbc.util.JDBCUtils;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
/**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : 操作 BLOB 类型字段
*/
public class BLOBTypeTest {
// 向数据表中插入大数据类型
@Test
public void insertBLOBType() throws Exception {
Connection connection = JDBCUtils.getConnection();
String sql = "insert into customers(name, email, birth, photo)values(?,?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "猫猫");
ps.setString(2, "cat@gmail.com");
ps.setDate(3, new Date(new java.util.Date().getTime()));
//
FileInputStream fis = new FileInputStream(new File("cat.png"));
ps.setBlob(4, fis);
ps.execute();
fis.close();
JDBCUtils.closeResource(connection, ps);
}
// 修改数据表中的大数据类型
@Test
public void updateBLOBType() throws Exception{
Connection connection = JDBCUtils.getConnection();
String sql = "update customers set photo = ? where name = ?";
PreparedStatement ps = connection.prepareStatement(sql);
// 批量插入
FileInputStream fis = new FileInputStream(new File("girl.jpg"));
ps.setBlob(1, fis);
ps.setString(2, "猫猫");
ps.execute();
fis.close();
JDBCUtils.closeResource(connection, ps);
}
// 从数据表中读取大数据类型
@Test
public void queryBLOBType() throws Exception{
Connection connection = JDBCUtils.getConnection();
String sql = "select id, name, email, birth, photo from customers where id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1, 22);
ResultSet 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 photo = rs.getBlob("photo");
InputStream is = photo.getBinaryStream();
FileOutputStream fos = new FileOutputStream(new File("cat-sql.png"));
byte[] buffer = new byte[1024];
int data = 0;
while ((data = is.read(buffer)) != -1) {
fos.write(buffer, 0, data);
}
JDBCUtils.closeResource(connection, ps, rs);
fos.close();
is.close();
}
}
}
总结和练习
【JDBC核心】操作 BLOB 类型字段的更多相关文章
- Spring JDBC处理BLOB类型字段
以下示例将演示使用spring jdbc更新BLOB类型的字段值,即更新student表中的可用记录. student表的结构如下 - CREATE TABLE student( ID INT NOT ...
- mybatis oracle BLOB类型字段保存与读取
一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用 ...
- oracle 在操作blob该字段是否会产生很多redo
操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob ( id ...
- Oracle中,如何将String插入到BLOB类型字段
1,String插入到BLOB类型字段,(这里的字符串以生成的XML为例): String XML = document.asXML(); //使用dom4j写成的xml是String类型,记得st ...
- oracle中如何判断blob类型字段是否为空
eg.假如有表T_GA_GRJBXX ,字段zp是blob类型 查询blob非空的记录 SELECT * FROM u_rs_sjgx.T_GA_GRJBXX TB WHERE TB.zp IS n ...
- SQLite中如何用api操作BLOB类型的字段
在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等.对于这些二进制数据(blob字段)我们不能像处理普通的文本那样简单的插入或者查询,为此SQLite提供了一组函数来处理 ...
- PDM->OOM->C#实体类生成时,对Blob类型字段的处理
pdm中的Blob字段生成OOM时,自动变成了string类型,再生成实体类时也是string 如何将oom中对应的blob字段设置为Byte[]类型,目前没找到方法, 只能通过脚本,将生成后的OOM ...
- (转载)VB 查询Oracle中blob类型字段,并且把blob中的图片以流的方式显示在Image上
原文摘自:http://heisetoufa.iteye.com/blog/ '模块代码 Private Declare Function CreateStreamOnHGlobal Lib &quo ...
- 【JDBC核心】实现 CRUD 操作
实现 CRUD 操作 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一个 Socket 连接. java.sql 包中有 ...
随机推荐
- redis学习之——持久化RDB 和AOF
RDB: 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.rdb 保存的是dump.rdb文件 RDB工作原理: Redis会 ...
- eclipse/myeclipse 使用技巧
一.变量名自动补全 原理是:在输入变量名后,去掉按下空格或=后,代码上屏 以前只知道alt+/调出assist,后来发现可以所有字母都激活content assist(8.1里有写).用起来果然很爽, ...
- DjangoRestFramework使用
目录: 1.1 DjangoRestFramework基本使用 1.2 drf认证&权限 模块 1.3 djangorestframework 序列化 1.4 djangorestframew ...
- sqli-labs less11-12(post型union注入)
less-11 post型union注入 过程: 输入admin admin 判断username password的闭合方式 对username查字段个数 ' union select 1,2# ' ...
- 登录linux时 shell执行顺序
# .bash_history,.bash_logout,.bash_profile,.bashrc/etc/profile 全局.bash_history 记录当前登录用户历史操作的命令.bash_ ...
- Spring Data JPA的基本学习之了解
Spring Data JPA 是 什 么 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Langu ...
- 持久层之 MyBatis: 第二篇 :动态SQL And多表查询
MyBatis入门到精通 完整CRUD UserDaoImpl 编写UserDao对应的UserDaoMapper.xml 添加UserDao的测试用例 编写UserDao的测试用例 解决数据库字段名 ...
- locust的使用
一.简介 Locust是一款使用Python编写的压力测试工具,本篇总结会介绍在实际测试过程中遇到的问题 https://www.locust.io/ 使用Locust的原因是因为可以模拟的用户数量可 ...
- Web项目访问在C盘的图片(不在当前项目路径下的图片)
使用ASPX页面处理 前台显示 <img src="/UeImg.aspx?path=C:/YxFile/ueditor/upload/image/20200211/637170508 ...
- Web项目Bin目录下的文件改动会引发Application_End事件,IIS会回收线程
原博文 https://blog.csdn.net/caca95/article/details/85284309 处理方法 Web项目Bin目录下的文件改动会引发Application_End事件, ...