`
qingtianzhu
  • 浏览: 15167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC读写MySQL的BLOB和CLOB类型数据(带代码)

    博客分类:
  • JDBC
阅读更多
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来操作,可以避免此问题。
1
2
分享到:
评论

相关推荐

    JDBC中操作Blob、Clob等对象

    在JDBC(Java Database Connectivity)编程中,Blob和Clob是非常重要的数据类型。Blob(Binary Large Object)主要用于存储二进制大对象,如图像、音频文件等;而Clob(Character Large Object)则用于存储大量的文本...

    JDBC中操作Blob、Clob等对象 实例详细 非常详细

    在Java数据库连接(JDBC)中,Blob(Binary Large Object)和Clob(Character Large Object)是用于存储大型二进制对象和文本对象的数据类型。这两种数据类型的使用在处理大量图像、文档或者长文本内容时变得尤为...

    使用Jdbc4操作Blob,Clob

    当涉及到处理大型对象(LOBs)如Blobs(Binary Large Objects)和Clobs(Character Large Objects)时,JDBC4提供了一种更为便捷的方式来操作这些数据类型。这篇博客“使用Jdbc4操作Blob,Clob”将深入讲解如何利用...

    Mybatis 处理 CLOB、BLOB 类型数据

    Mybatis 处理 CLOB、BLOB 类型数据 MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis ...通过使用 MyBatis 处理 CLOB 和 BLOB 类型数据,可以方便地存储和读取大字段类型的数据,提高应用程序的性能和可扩展性。

    jdbc_blob_clob.rar

    标题“jdbc_blob_clob.rar”暗示了这个压缩包文件包含的内容...“jdbc_blob_clob.txt”文件很可能是博客文章的全文,包括详细解释、示例代码和可能的注意事项。要深入理解Blob和Clob的处理,阅读这个文本文件将是关键。

    如何将DB2数据库中的大对象(BLOB,CLOB)数据类型复制到Oracle数据库中

    Oracle数据库同样支持BLOB和CLOB数据类型,但需要特殊配置来处理来自其他数据库的大对象数据。 3. **特殊配置策略**: - **联邦能力**:利用WII的联邦功能,先将DB2中的非BLOB字段复制到Oracle目标表中。 - **...

    CLOB、BLOB___CLOB与BLOB的区别

    CLOB 和 BLOB 是两种不同的数据库类型,用于存储不同的数据类型。CLOB 主要用于存储字符数据,而 BLOB 主要用于存储二进制数据。在 MySQL 中,BLOB 有多种类型,每种类型都有其自己的最大存储大小限制。Java 中可以...

    BLOB和CLOB的区别以及在ORALCE中的插入和查询操作

    在数据库管理领域,BLOB(Binary Large Object)和CLOB(Character Large Object)是两种用于存储大量非结构化数据的数据类型。它们都是Oracle数据库中重要的字段类型,用于处理大数据量的文本或二进制文件。了解...

    详解jdbc实现对CLOB和BLOB数据类型的操作

    JDBC实现对CLOB和BLOB数据类型的操作 在数据库中,存在两种类型的数据:CLOB(Character Large OBject)和BLOB(Binary Large OBject),它们用于存储大型数据,如文本、图片、音频、视频等。对CLOB和BLOB数据类型...

    oracle(blob转换为clob)

    在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...

    Oracle8i对Blob和Clob类型的操作

    这两种数据类型用于存储大量二进制数据(如图片、视频或文档)和文本数据(如长篇文章或XML文件),这在处理大数据量和多媒体信息时非常关键。 **BLOB类型**: BLOB用于存储非结构化的二进制数据,如图像、音频文件...

    oracle Blob转换Clob

    - **数据类型**:Blob存储的是二进制数据,而Clob存储的是字符数据。 - **应用场景**:Blob适用于图片、视频等多媒体文件的存储;Clob则更适用于文档、文章等文本数据的存储。 - **处理方式**:Blob数据通常需要通过...

    mysql和Oracle在对clob和blob字段的处理

    MySQL提供了`TEXT`和`BINARY`系列的数据类型来对应`CLOB`和`BLOB`。`LONGTEXT`和`LONGBLOB`是最接近`CLOB`和`BLOB`的数据类型,分别可存储最大4GB的字符和二进制数据。MySQL将这些大型数据存储在外存,以减少内存...

    利用spring的jdbcTemplate处理blob、clob

    spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。

    jdbc读写Oracle的CLOB字段

    JDBC读写Oracle的CLOB字段

    oracle中的Blob和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 操作oracle blob数据jdbc ...

    Blob和Clob使用例子

    Blob(Binary Large Object)和Clob(Character Large Object)是数据库中用来存储大量二进制数据和字符数据的两种特殊类型。在Java编程语言中,它们是`java.sql.Blob`和`java.sql.Clob`接口的实现,常用于与数据库...

    在SOAP消息中传输BLOB和CLOB数据

    本篇将深入探讨如何在SOAP中有效地处理这两种特殊数据类型。 BLOBs通常用于存储图像、音频、视频等非文本数据,而CLOBs则用于存储大量文本数据,如长篇文章或数据库记录。由于它们的大小可能非常大,所以在SOAP中...

Global site tag (gtag.js) - Google Analytics