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中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等...
JDBC中操作Blob、Clob等对象
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。
Mybatis 处理 CLOB、BLOB 类型数据
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
JDBC读写Oracle的CLOB字段
主要介绍了详解jdbc实现对CLOB和BLOB数据类型的操作的相关资料,这里实现写入操作与读写操作,需要的朋友可以参考下
BLOB和CLOB的区别以及在ORALCE中的插入和查询操作
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 ...
oracle Blob转换Clob
CLOB、BLOB___CLOB与BLOB的区别
oracle中的Blob和Clob区别,希望对大家学习有帮助呵
mysql写入或读取一段数据块时,数据类型为blob型,本代码详细介绍在mysqll中如何读写blob格式数据
oracle Blob Clob 大数处理 代码 文件上传 下载
对非DB2数据库的数据复制, 不直接支持LOB(BLOB,ClOB)等大对象数据类型,但在实际应用中,用户需要复制的表中有可能有BLOB等大对象数据,如果数据目标为Oracle,这类大对象复制的需求可通过对WII的复制进行特殊配置实现...
NULL 博文链接:https://53873039oycg.iteye.com/blog/2009996
delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...
使用Hibernate映射Blob,Clob字段,并对这些字段完成存,取功能
weblogic下转换oracle 的clob类型经常报转型错误,本例子通过反射解决weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB转型成oracle.sql.CLOB问题
前两个例子的Demo 博文链接:https://zhangguanzhong.iteye.com/blog/623489