JDBC对LOB的读写
在JDBC中提供了java.sql.Blob和java.sql.Clob两个类分别代表BLOB和CLOB数据
•BLOB(Binary Large Object):用于存储大量的二进制数据
•CLOB(Character Large Object):用于存储大量的文本数据
本文以MySQL为例,通过最基本的JDBC技术来处理大字段的插入、读取操作。
环境: MySQL5 JDK1.6
1)首先创建一张数据表:
create table stuinfo(
id int(11) not null auto_increment,
name varchar(20)default null,
content mediumtext ,
image blob,
primary key (id)
);
2)先数据库中插入BLOB和CLOB类型的数据
package cn.wjz.jdbc;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import cn.wjz.db.ConnectionFactory;
import cn.wjz.db.DbClose;
public class LobWrite {
public void LobW(){
Connection conn = ConnectionFactory.getConnection() ;
PreparedStatement pstmt = null ;
String sql =
"insert into stuinfo(name,content,image) values(?,?,?)" ;
try{
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1, "test") ;
/从文件中获取输入流———读取文本
File file = new File("D:\\wjz.gif");
try{
InputStreamReader reader = new InputStreamReader
(new FileInputStream("D:\\test.txt"));
pstmt.setCharacterStream
(2, reader, (int) file.length());
}catch(Exception e){
e.printStackTrace() ;
}
File file1 = new File("D:\\wjz.gif");
InputStream in;
try {
in = new BufferedInputStream
(new FileInputStream(file1));
pstmt.setBinaryStream
(3, in, (int) file1.length());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if(pstmt.executeUpdate() == 1){
System.out.println("恭喜您成功添加记录!!");
}else{
System.out.println("对不起您添加记录失败!!");
}
}catch(SQLException e){
e.printStackTrace();
DbClose.close(pstmt , conn ) ;
}
}
public static void main(String args[]){
LobWrite lobtest = new LobWrite() ;
lobtest.LobW() ;
}
}
3)从MySql数据库中读取BLOB和CLOB类型数据:
package cn.wjz.jdbc;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.wjz.db.ConnectionFactory;
import cn.wjz.db.DbClose;
public class LobRead {
public void lobread(){
Connection conn = ConnectionFactory.getConnection();
PreparedStatement pstmt = null;
String sql =
"SELECT id,name,content,image FROM stuinfo WHERE name=?";
ResultSet rs = null;
BufferedReader br =null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "test");
rs = pstmt.executeQuery();
while (rs.next()) {
Reader rd = rs.getCharacterStream(3);
br = new BufferedReader(rd);
String str = null;
while((str = br.readLine()) != null){
System.out.println(str);
}
Blob blob = rs.getBlob(4);
BufferedInputStream bis =
new BufferedInputStream(blob.getBinaryStream());
BufferedOutputStream bos = new BufferedOutputStream
(new FileOutputStream("d:/wjz.gif"));
byte[] buffer = new byte[1024];
int count = -1;
while ((count = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
System.out.println("\n------->图片写好了!");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
DbClose.close(pstmt, conn);
}
}
public static void main(String[] args) {
LobRead lobread = new LobRead();
lobread.lobread();
}
}
在处理blob字段时候,由于直接处理的是二进制流,所以没啥问题。在处理clob字段的时候,由于数据库对clob是以字符的形式进行存储,这就有一个编码问题。本文虽然成功的插入读取了clob字段,但是还没有解决乱码问题,因为JDBC在获取到clob的时候,已经对其进行了编码,Reader reader = rs.getCharacterStream(1); 这就导致了编码的混乱,如果要彻底解决,还需要看看MySQL驱动的实现。通过非常规手段来解决。为了绕开此问题,可以将clob的数据存储为blog来操作,可以避免此问题。
分享到:
相关推荐
在JDBC(Java Database Connectivity)编程中,Blob和Clob是非常重要的数据类型。Blob(Binary Large Object)主要用于存储二进制大对象,如图像、音频文件等;而Clob(Character Large Object)则用于存储大量的文本...
在Java数据库连接(JDBC)中,Blob(Binary Large Object)和Clob(Character Large Object)是用于存储大型二进制对象和文本对象的数据类型。这两种数据类型的使用在处理大量图像、文档或者长文本内容时变得尤为...
当涉及到处理大型对象(LOBs)如Blobs(Binary Large Objects)和Clobs(Character Large Objects)时,JDBC4提供了一种更为便捷的方式来操作这些数据类型。这篇博客“使用Jdbc4操作Blob,Clob”将深入讲解如何利用...
Mybatis 处理 CLOB、BLOB 类型数据 MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis ...通过使用 MyBatis 处理 CLOB 和 BLOB 类型数据,可以方便地存储和读取大字段类型的数据,提高应用程序的性能和可扩展性。
标题“jdbc_blob_clob.rar”暗示了这个压缩包文件包含的内容...“jdbc_blob_clob.txt”文件很可能是博客文章的全文,包括详细解释、示例代码和可能的注意事项。要深入理解Blob和Clob的处理,阅读这个文本文件将是关键。
Oracle数据库同样支持BLOB和CLOB数据类型,但需要特殊配置来处理来自其他数据库的大对象数据。 3. **特殊配置策略**: - **联邦能力**:利用WII的联邦功能,先将DB2中的非BLOB字段复制到Oracle目标表中。 - **...
CLOB 和 BLOB 是两种不同的数据库类型,用于存储不同的数据类型。CLOB 主要用于存储字符数据,而 BLOB 主要用于存储二进制数据。在 MySQL 中,BLOB 有多种类型,每种类型都有其自己的最大存储大小限制。Java 中可以...
在数据库管理领域,BLOB(Binary Large Object)和CLOB(Character Large Object)是两种用于存储大量非结构化数据的数据类型。它们都是Oracle数据库中重要的字段类型,用于处理大数据量的文本或二进制文件。了解...
JDBC实现对CLOB和BLOB数据类型的操作 在数据库中,存在两种类型的数据:CLOB(Character Large OBject)和BLOB(Binary Large OBject),它们用于存储大型数据,如文本、图片、音频、视频等。对CLOB和BLOB数据类型...
在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...
这两种数据类型用于存储大量二进制数据(如图片、视频或文档)和文本数据(如长篇文章或XML文件),这在处理大数据量和多媒体信息时非常关键。 **BLOB类型**: BLOB用于存储非结构化的二进制数据,如图像、音频文件...
- **数据类型**:Blob存储的是二进制数据,而Clob存储的是字符数据。 - **应用场景**:Blob适用于图片、视频等多媒体文件的存储;Clob则更适用于文档、文章等文本数据的存储。 - **处理方式**:Blob数据通常需要通过...
MySQL提供了`TEXT`和`BINARY`系列的数据类型来对应`CLOB`和`BLOB`。`LONGTEXT`和`LONGBLOB`是最接近`CLOB`和`BLOB`的数据类型,分别可存储最大4GB的字符和二进制数据。MySQL将这些大型数据存储在外存,以减少内存...
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
JDBC读写Oracle的CLOB字段
在Oracle数据库中,`BLOB`(Binary Large Object)和`CLOB`(Character Large Object)是用于存储大量数据的两种特殊数据类型。这两种类型都属于`LOB`(Large Object)类别,主要用于处理大数据量的存储问题。 ####...
jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc ...
Blob(Binary Large Object)和Clob(Character Large Object)是数据库中用来存储大量二进制数据和字符数据的两种特殊类型。在Java编程语言中,它们是`java.sql.Blob`和`java.sql.Clob`接口的实现,常用于与数据库...
本篇将深入探讨如何在SOAP中有效地处理这两种特殊数据类型。 BLOBs通常用于存储图像、音频、视频等非文本数据,而CLOBs则用于存储大量文本数据,如长篇文章或数据库记录。由于它们的大小可能非常大,所以在SOAP中...