LOB,Large Objects,是一种用于存储大对象的数据类型,一般LOB又分为BLOB与CLOB。BLOB通常用于存储二进制数据,比如图片、音频、视频等。CLOB通常用于存储大文本,比如小说。

MySQL数据库中没有专门的CLOB数据类型,而如果要存储大文本,MySQL采用的是TEXT类型。TEXT类型又有TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT之分。MySQL中的BLOB类型又可分为TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。

使用JDBC处理大文本

向MySQL中存储大文本,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定 Reader 对象

void setCharacterStream(int parameterIndex, Reader reader) throws SQLException

// 将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度(int型)

void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException

// 将指定参数设置为给定 Reader 对象,该对象具有给定字符数长度(long型)

void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException

如果需要从MySQL数据库中获取大文本列字段值,则可以使用ResultSet的如下方法:

// 以 java.io.Reader 对象的形式获取此 ResultSet 对象的当前行中指定列的值

Reader getCharacterStream(int columnIndex) throws SQLException Reader getCharacterStream(String columnLabel) throws SQLException

// 以 String 的形式获取此 ResultSet 对象的当前行中指定列的值

String getString(int columnIndex) throws SQLException String getString(String columnLabel) throws SQLException

示例:

代码:

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.io.Reader;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**  * 使用JDBC操作大文本

*  * @author

*  */

public class ClobTest {

/**      * 使用JDBC向数据库表中插入大文本数据

*      * @throws SQLException

*/

public static void add() throws SQLException {

Connection conn = null;

PreparedStatement pstmt = null;

// 获取数据库会话对象

JdbcSession session = JdbcSessionFactory.getCurrentSession();

// 获取数据库连接

conn = session.getConnection();

// 创建SQL语句:向小说表中添加一条章节内容的记录

String sql = "INSERT INTO novel(content) VALUES(?)";

// 创建PreparedStatement对象

pstmt = conn.prepareStatement(sql);

// 创建Reader对象

File file = new File(Thread.currentThread().getClass().getResource("/novel/1.txt").getPath());

Reader reader = null;

try {

reader = new FileReader(file);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

// 设置参数

pstmt.setCharacterStream(1, reader, (int) file.length());

// 执行SQL语句

int count = pstmt.executeUpdate();

// 处理结果

if (count > 0)

System.out.println("添加成功");

else

System.out.println("添加失败");

// 释放资源

JdbcResourceManager.close(pstmt);

JdbcResourceManager.close(conn);

JdbcSessionFactory.closeSession();

}

public static void read() throws SQLException {

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

// 获取数据库会话对象

JdbcSession session = JdbcSessionFactory.getCurrentSession();

// 获取数据库连接

conn = session.getConnection();

// 创建SQL语句

String sql = "SELECT id, content FROM novel";

// 创建PreparedStatement对象

pstmt = conn.prepareStatement(sql);

// 执行SQL语句

rs = pstmt.executeQuery();

// 处理结果

while (rs.next()) {

// 读取小说内容

Reader reader = rs.getCharacterStream("content");

int ch;

try {

while((ch = reader.read()) != -1){

System.out.print((char)ch);

}

} catch (IOException e) {

e.printStackTrace();

}

}

// 释放资源

JdbcResourceManager.close(rs);

JdbcResourceManager.close(pstmt);

JdbcResourceManager.close(conn);

JdbcSessionFactory.closeSession();

}

public static void main(String[] args) {

try {

add();

read();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

使用JDBC处理二进制数据     

向MySQL中存储二进制数据,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定输入流。

void setBinaryStream(int parameterIndex, InputStream x)

// 将指定参数设置为给定输入流,该输入流将具有给定字节数(int型)。

void setBinaryStream(int parameterIndex, InputStream x, int length)

// 将指定参数设置为给定输入流,该输入流将具有指定字节数(long型)。

void setBinaryStream(int parameterIndex, InputStream x, long length)

如果需要从MySQL数据库中获取二进制列字段值,则可以使用ResultSet的如下方法:

// 以未解释字节的流的形式获取此 ResultSet 对象的当前行中指定列的值。

InputStream getBinaryStream(int columnIndex)

// 以未解释的 byte 流的形式获取此 ResultSet 对象的当前行中指定列的值。

InputStream getBinaryStream(String columnLabel)

// 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。

Blob getBlob(int columnIndex)

// 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。

Blob getBlob(String columnLabel)

获取Blob对象后可以继续调用getBinaryStream()方法获取输入流。

示例:

代码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

/**  * 使用JDBC操作二进制数据

*  * @author

*  */

public class BlobTest {

/**      * 插入二进制数据到数据库

*      * @throws Exception

*/

public static void add() throws Exception {

Connection conn = null;

PreparedStatement pstmt = null;

// 获取数据库会话对象

JdbcSession session = JdbcSessionFactory.getCurrentSession();

// 获取数据库连接

conn = session.getConnection();

// 插入音乐数据的SQL语句

String sql = "INSERT INTO music(content) VALUES(?)";

pstmt = conn.prepareStatement(sql);

// 创建PreparedStatement对象

pstmt = conn.prepareStatement(sql);

// 创建Reader对象

File file = new File(Thread.currentThread().getClass().getResource("/music/08.Along_in_the_night.mp3").getPath());

InputStream fis = new FileInputStream(file);

// 生成的流

pstmt.setBinaryStream(1, fis, file.length());

// 执行SQL语句

int count = pstmt.executeUpdate();

// 处理结果

if (count > 0)

System.out.println("添加成功");

else

System.out.println("添加失败");

// 释放资源

JdbcResourceManager.close(pstmt);

JdbcResourceManager.close(conn);

JdbcSessionFactory.closeSession();

}

/**      * 从数据库中读二进制数据

*      * @throws Exception

*/

public static void read() throws Exception {

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

// 获取数据库会话对象

JdbcSession session = JdbcSessionFactory.getCurrentSession();

// 获取数据库连接

conn = session.getConnection();

// 创建SQL语句

String sql = "SELECT id, content FROM music WHERE id=?";

// 创建PreparedStatement对象

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, 1);

// 执行SQL语句

rs = pstmt.executeQuery();

// 处理结果

if (rs.next()) {

InputStream in = rs.getBinaryStream("content");

// 获取列字段InputStream对象

// 缓冲数组

byte buf[] = new byte[1024];

int len;

// 输出流,将读取到的音乐数据保存到D盘

OutputStream out = new FileOutputStream("D:\\1.mp3");

while ((len = in.read(buf)) != -1) {

out.write(buf, 0, len);

}

in.close();

out.close();

}

// 释放资源

JdbcResourceManager.close(rs);

JdbcResourceManager.close(pstmt);

JdbcResourceManager.close(conn);

JdbcSessionFactory.closeSession();

}

public static void main(String[] args) throws Exception {

add();

read();

}

}

使用JDBC处理MySQL大文本和大数据的更多相关文章

  1. 【JDBC】Mysql海量数据插入——PreparedStatement加快数据插入

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5861959.html 使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢.此时,我 ...

  2. 利用JDBC处理mysql大数据--大文本和二进制文件等

    转载自http://www.cnblogs.com/xdp-gacl/p/3982581.html 一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob, ...

  3. 使用JDBC处理MySQL大数据

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

  4. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

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

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

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

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

  7. JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据

    一.什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据 ...

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

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

  9. JDBC处理mysql大数据

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

随机推荐

  1. ListView常用属性 (2012-01-12 17:20:27)

    比较特别的属性,通过设置这样的属性可以做出更加美观的列表.stackFromBottom——设置该属性之后你最新条目就会显示你列表的最下面,值为true和false,如android:stackFro ...

  2. 小程序button默认样式透彻理解

    微信小程序有一个默认样式,特别是有一个外边框,虽然看起来不别扭,但是自己每次设置border:0:都不生效,写成内联的样式也不生效,后来才知道里面的边框是伪元素的边框,这里的伪元素可以理解为用css动 ...

  3. mongodb--命令练习

    windows10安装下载mongodb # 官网或镜像地址下载mongodb exe 二进制安装包 # 安装时选用custorm 去除勾选compass可视化工具 # 安装完成创建data文件,修改 ...

  4. 修改虚拟机中Linux的IP

    联网:ifup eth0 查看ip:ifconfig 点击编辑,选择NAT,子网ip修改第三字段为25,确定,重启linux后,会自动分配字段为25的ip 或者,也可以修改为自己想要的ip,如图:进入 ...

  5. 深入理解PHP之foreach

    招聘 标签(空格分隔): 招聘 PHP 国贸 语言基础 foreach 语法结构提供了遍历数组的简单方式. php5之前, foreach仅能用于数组php5+, 利用foreach可以遍历对象 fo ...

  6. python正则表达式提取字符串

    用python正则表达式提取字符串 在日常工作中经常遇见在文本中提取特定位置字符串的需求.python的正则性能好,很适合做这类字符串的提取,这里讲一下提取的技巧,正则表达式的基础知识就不说了,有兴趣 ...

  7. 关于datanode多磁盘存储策略

    目的: 节点内各存储磁盘均衡 相关参数: dfs.datanode.fsdataset.volume.choosing.policy=org.apache.hadoop.hdfs.server.dat ...

  8. App后台开发运维和架构实践学习总结(5)——App产品从需求到研发到开发到上线到产品迭代全过程

    前言 如果没有做过开发,研发过产品的人,很难体会做产品的艰难,刚进公司的人,一般充当的是程序开发,我这里说的是开发,它与研发是有区别的. 一个需求下来,如果不能很好地理解产品需求,如果不能很好的驾驭需 ...

  9. Self Centos + Windows server 2016

    Set up by Derek: 2019-1-25 登陆个人物理机: license  60天Free , 如果过期,就在 VMware ESXI 6.5.0的黑屏界面去reset. https:/ ...

  10. ECMAScript 6 入门学习笔记(一)——let和const

    一.let ①声明变量 let a = 1: ②只在所在代码块内有效,不影响块以外 ③不存在变量提升(不能先用后声明) ④暂时性死区 let声明的变量“绑定”这个区域,不受外部影响. let声明之前, ...