【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 包中有 ...
随机推荐
- 使用darkarmour免杀mimikatz
darkarmour是一个可用来免杀exe的项目,github地址:https://github.com/bats3c/darkarmour 我们使用darkarmour来免杀mimikatz. ./ ...
- WPF源代码分析系列一:剖析WPF模板机制的内部实现(一)
众所周知,在WPF框架中,Visual类是可以提供渲染(render)支持的最顶层的类,所有可视化元素(包括UIElement.FrameworkElment.Control等)都直接或间接继承自Vi ...
- CSP-S 2019 Emiya 家今天的饭
64 pts 类似 乌龟棋 的思想,由于 \(64pts\) 的 \(m <= 3\), 非常小. 我们可以设一个 \(dp\),建立 \(m\) 个维度存下每种物品选了几次: \(f[i][A ...
- 7、Spring Cloud Hystrix
1.Spring Cloud Hystrix简介 (1).分布式问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 多个微服务之间调用的时候,假设微服务A调 ...
- gulp-sourcemaps的用法
1.项目文件夹中,安装gulp-sourcemaps插件 npm install --save gulp-sourcemaps 2.gulpfile.js文件,导入要用到的插件. 如: // 引入gu ...
- django 取出数据库的时间与当前时间相加减
1 转换时区utc比北京时间慢八个小时 from datetime import tzinfo, timedelta, datetime ZERO = timedelta(0) class UTC(t ...
- js 控制输入框保存数字级小数点后一位
$('#Question8').on('keyup', function () { var regVoter = $("#Question8").val(); regVoter = ...
- 密码管理平台ratticdb的部署,在centos7上的部署
一,前言 一直想用ratticdb这个有web界面的密码管理工具,百度了一下居然没有找到中文的部署文档,访问官网也是notfound.找到了官方的部署指南:https://github.com/til ...
- learn Docker from scratch (1)
一.前言 Docker容器一个很有趣的东西,下面链接内容适合docker的入门非常棒! 链接如下: http://www.ruanyifeng.com/blog/2018/02/docker-tuto ...
- 线段树入门详解,洛谷P3372 【模板】线段树 1
关于线段树: 本随笔参考例题 P3372 [模板]线段树 1 所谓线段树就是把一串数组拆分成一个一个线段形成的一棵树. 比如说像这样的一个数组1,2,3,4,5: 1 ~ 5 / ...