一、什么是大数据

  所谓大数据,就是大的字节数据,或大的字符数据。大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像、声音、二进制文等。

  在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的。

  对MySQL而言只有blob,而没有clob,mysql存储大文本数据采用的是Text:

类型

长度

tinytext

28--1B(256B)

text

216-1B(64K)

mediumtext

224-1B(16M)

longtext

232-1B(4G)

  存储二进制大数据blob的类型为:

类型

长度

tinyblob

28--1B(256B)

blob

216-1B(64K)

mediumblob

224-1B(16M)

longblob

232-1B(4G)

二、测试程序

2.1 处理MySQL的大文本

  对于MySQL中的Text类型,可调用如下方法设置:

PreparedStatement.setCharacterStream(index, reader, length);//注意length长度须设置,并且设置为int型

  对MySQL中的Text类型,可调用如下方法获取:

reader = resultSet. getCharacterStream(String columnLabel);
string s = resultSet.getString(String columnLabel);

 【编写SQL测试脚本】

create database jdbcstudy;
use jdbcstudy;
create table testclob
(
id int primary key auto_increment,
resume text
);

【编写测试代码】

/**
* 使用JDBC操作MySQL的大文本
*/
public class JdbcOperaClob {
/**
* 向数据库中插入大文本数据
*/
@Test
public void add() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Reader reader;
try {
conn = JdbcUtils.getConnection();
String sql = "insert into testclob(resume) values(?)";
pstmt = conn.prepareStatement(sql);
// 这种方式获取的路径,如果路径中带有中文字符,会出现乱码,导致找不到路径
String path = this.getClass().getClassLoader().getResource("data.txt").getPath();
// 解决获取文件路径出现乱码的问题
path = java.net.URLDecoder.decode(path, "utf-8");
File file = new File(path);
reader = new FileReader(file);
pstmt.setCharacterStream(1, reader, (int) file.length());
int num = pstmt.executeUpdate();
if (num > 0) {
System.out.println("插入成功");
}
// 关闭流
reader.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn, pstmt, rs);
}
} /**
* 读取数据库中的大文本数据
*/
@Test
public void read() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select resume from testclob where id=2";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery(); String contentStr = "";
String content = "";
if (rs.next()) {
//使用resultSet.getString("字段名")获取大文本数据的内容
content = rs.getString("resume");
//使用resultSet.getCharacterStream("字段名")获取大文本数据的内容
Reader reader = rs.getCharacterStream("resume");
char[] buffer = new char[1024];
int len = 0;
FileWriter out = new FileWriter("D:\\1.txt");
while ((len = reader.read(buffer)) > 0) {
contentStr += new String(buffer);
out.write(buffer, 0, len);
}
out.close();
reader.close();
}
System.out.println(content);
System.out.println("-------------------");
System.out.println(contentStr);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn, pstmt, rs);
}
}
}

2.2 处理MySQL的二进制数据

【编写SQL测试脚本】

create table testblob
(
id int primary key auto_increment,
image longblob
);

【方法一】

  向数据库插入二进制数据需要使用PreparedStatement为原setBinaryStream(int, InputSteam)方法来完成。

PreparedStatement.setBinaryStream(i, inputStream, length);

  读取二进制数据,需要在查询后使用ResultSet类的getBinaryStream()方法来获取输入流对象。也就是说,PreparedStatement有setXXX(),那么ResultSet就有getXXX()。

InputStream in  = resultSet.getBinaryStream(String columnLabel);

  代码如下:

/**
* 使用JDBC操作MySQL的二进制数据(例如图像、声音、二进制文件)
*/
public class JdbcOperaBlob {
@Test
public void add() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "insert into testblob(image) values(?)";
pstmt = conn.prepareStatement(sql);
// 这种方式获取的路径,如果路径中带有中文字符,会出现乱码,导致找不到路径
String path = this.getClass().getClassLoader().getResource("a.jpg").getPath();
// 解决获取文件路径出现乱码的问题
path = java.net.URLDecoder.decode(path, "utf-8");
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
pstmt.setBinaryStream(1, fis, (int) file.length());
int num = pstmt.executeUpdate();
if (num > 0) {
System.out.println("插入成功");
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn, pstmt, rs);
}
} /**
* 读取数据库中的二进制数据
*/
@Test
public void read() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select image from testblob where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery();
if (rs.next()) {
InputStream in = rs.getBinaryStream("image");
int len = 0;
byte[] bytes = new byte[1024];
FileOutputStream out = new FileOutputStream("D:\\1.jpg");
while ((len = in.read(bytes)) > 0) {
out.write(bytes, 0, len);
}
in.close();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn, pstmt, rs);
}
}
}

【方法二】:

  把要存储的数据包装成Blob类型,然后调用PreparedStatement的setBlob()方法来设置数据:

PreparedStatement.setBlob (int parameterIndex, Blob x)

  获取数据时,再调用如下方法:

InputStream in  = resultSet.getBlob(String columnLabel).getBinaryStream(); 

  测试代码如下:

/**
* 使用JDBC操作MySQL的二进制数据(例如图像、声音、二进制文件)
*/
public class JdbcOperaBlob {
@Test
public void add() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "insert into testblob(image) values(?)";
pstmt = conn.prepareStatement(sql);
// 这种方式获取的路径,如果路径中带有中文字符,会出现乱码,导致找不到路径
String path = this.getClass().getClassLoader().getResource("a.jpg").getPath();
// 解决获取文件路径出现乱码的问题
path = java.net.URLDecoder.decode(path, "utf-8");
File file = new File(path);
FileInputStream fis = new FileInputStream(file); /**
* 需要得到Blob
* 1.我们有的是文件,目标是Blob
* 2.先把文件变成byte[]
* 3.再使用byte[]创建Blob
*/
// 把文件转换成byte[]
// IOUtils是org.apache.commons.io下的一个工具类
byte[] bytes = IOUtils.toByteArray(fis);
// 使用byte[]创建Blob
Blob blob = new SerialBlob(bytes);
// 设置参数
pstmt.setBlob(1, blob);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, pstmt, rs);
}
} /**
* 读取数据库中的二进制数据
*/
@Test
public void read() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select image from testblob where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 2);
rs = pstmt.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob("image");
/**
* 把Blob变成硬盘上的文件
*/
/**
* 1.通过Blob得到输入流对象
* 2.自己创建输出流对象
* 3.把输入流的数据写入到输出流中
*/
InputStream in = blob.getBinaryStream();
OutputStream out = new FileOutputStream("D:/2.jpg");
IOUtils.copy(in, out);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn, pstmt, rs);
}
}
}

参考:https://www.cnblogs.com/xdp-gacl/p/3982581.html

JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据的更多相关文章

  1. javaweb学习总结(三十四)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  2. javaweb(三十四)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  3. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  4. Mysql学习总结(13)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  5. 十七:使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  6. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  7. JavaWeb(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  8. JavaWeb学习总结(十)--JDBC之MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 但是,在mysql ...

  9. Javaweb学习笔记——(十七)——————JDBC的原理、四大核心类、四大参数、预编译、Dao模式、批处理、大数据、时间类型的转换

    JDBC入门 *导入jar包:驱动 *加载驱动类:Class.forName("类名"); *给出url.username.password,其中url背下来 *使用DriverM ...

随机推荐

  1. 201671010140. 2016-2017-2 《Java程序设计》java学习第八周

    第八周Java学习      本周,老师带领我们完善了一下继承,借口,拷贝,lambda表达式,内部类方面欠缺,不完善的地方,帮助我们查漏补缺.       以拷贝的学习为例,我本来对拷贝的理解非常浅 ...

  2. 使用ES6的Promis完美解决ajax的回调(优化代码)

    相信经常使用ajax的前端小伙伴,都会遇到这样的困境:一个接口的参数会需要使用另一个接口获取. 年轻的前端可能会用同步去解决(笑~),因为我也这么干过,但是极度影响性能和用户体验. 正常的前端会把接口 ...

  3. ParallaxEffect

    [ParallaxEffect] ParallaxEffect是一种用简单的2D贴图来模拟3D效果的简易方法.譬如一棵树,摄像机俯视时,当树远离摄像机时,树顶偏远,当树靠近,树顶偏近.苹果官方Adve ...

  4. SQL Server 触发器触发器

    内容摘抄自http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html,只供自己笔记使用 触发器是一种特殊类型的存储过程,它不同于之前的我们 ...

  5. c# 获取客户端ip、mac、机器名、操作系统、浏览器信息

    d using System; using System.Collections.Generic; using System.Linq; using System.Web; using System. ...

  6. Linux 下五款出色的流媒体客户端

    数 字流媒体这几天几乎占据了我音乐收听的全部时间.近年来我为了收藏 CD 花费了数量可观的费用:但它们中的大部分现在正静静地躺在满是灰尘的角落里.基本上所有的音乐流媒体服务所提供的的音质都不如 CD ...

  7. c语言实践 统计输入的一串正整数里面奇数和偶数的个数

    怎么考虑这个问题. 首先先确定肯定是需要一个变量保存输入的数据的,我们叫它input,最后结果要的是个数,所以需要另外两个变量来保存奇数的个数和偶数的个数. int input int countJ ...

  8. Requests接口测试(三)

    一.定制请求头 我们先来看一下,关于请求头的定制演示,相信了解http协议的小伙伴应该对请求头部headers请求头部并不陌生,那么作为实际工作中的我们,如果想自定义一些请求头的信息,我们应该怎么办呢 ...

  9. Jmeter接口测试-完成任务API

    完成任务 PUT /api/tasks/:task_id 可以完成id为task_id的task,如果动作成功,该接口返回的task的done字段会变成true. 完成任务的api接口测试很简单,因为 ...

  10. 如何处理与开发有争议的Bug?

     工作中,测试人员有时会遇到类似的问题:提交了一份软件缺陷报告,可由于某种原因,无论是开发人员还是开发经理就是不愿修改程序.应如何处理这类问题呢?我认为,当对报告出现分歧意见后,测试工程师应首先做如下 ...