使用JDBC处理MySQL大文本和大数据
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大文本和大数据的更多相关文章
- 【JDBC】Mysql海量数据插入——PreparedStatement加快数据插入
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5861959.html 使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢.此时,我 ...
- 利用JDBC处理mysql大数据--大文本和二进制文件等
转载自http://www.cnblogs.com/xdp-gacl/p/3982581.html 一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob, ...
- 使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- jdbc基础 (三) 大文本、二进制数据处理
LOB (Large Objects) 分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- javaweb(三十四)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据
一.什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据 ...
- Mysql学习总结(13)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- JDBC处理mysql大数据
大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时是需要用程序把 ...
随机推荐
- Pycharm中通过扩展工具添加QTDesigner
1.在电脑中找到Designer.exe的安装目录: 2.在pycharm中打开file->Settings->Tools->External Tools进行配置: 配置如下图所示: ...
- 批量生成随机字符串并保存到excel
需要导入jxl.jar,commons-lang-2.6.jar 链接:https://pan.baidu.com/s/1NPPh24XWxkka68x2JQYlYA 提取码:jvj3 链接:http ...
- java命令行版的ATM
import java.util.*;public class Jatm{ static String user = "123"; static String password = ...
- STL++?pb_ds平板电视初步探索
什么是pb_ds? 除了众所周知的STL库,c++还自带了ext库(应该可以这么叫吧),其中有用pb_ds命名的名称空间(俗称平板电视).这个名称空间下有四个数据类型结构.这些都是鲜为人知的.经过测试 ...
- ecshop笔记
***ecshop在线入门手册***:http://book.ecmoban.com/ 解决ecshop与jquery冲突问题1.修改文件:/js/transport.js在文件最底部增加代码: if ...
- java 中序列化(Serializable)
18年5月份,在毕业快一年的时候,我终于把自己从研发助理偏向行政打杂,偶尔写一些前端代码的处境,回归到了初衷-安安静静写前后端代码的小小程序员~过程中的心酸也就不在这里吐啦,毕竟我是小太阳,永不熄灭的 ...
- [luoguP2758] 编辑距离(DP)
传送门 f[i][j] 表示第一串前 i 个到第二串前 j 个的最小编辑距离 f[i][j] = f[i - 1][j - 1] (s1[i] == s2[j]) f[i][j] = min(f[i ...
- hdu 2546 0-1背包
#include<stdio.h> #include<string.h> #define N 1100 int dp[N],a[N]; int main() { int n,m ...
- T1082 线段树练习3 codevs
http://codevs.cn/problem/1082/ 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 ...
- 洛谷—— P2047 社交网络
P2047 社交网络 题目描述 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系. ...