`

用jdbc操作CLOB型数据的两种方式

 
阅读更多

最近学Oracle,正好单位OA中Word文件是将文件用BASE64方式编码后用CLOB型写入数据库的,因此有心测试JDBC对CLOB型的操作(百度的排版好像不太好用,凑合看吧)。
准备工作:
一、去http://commons.apache.org/codec/下载BASE64的编解码包
二、去http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html下载10G以后的ojdbc14.jar,用9i自带的的ojdbc14.jar在使用第二种方法的时候不能超过4000字节
三、登录到Oracle,将hr用户解锁,建立测试表test,SQLPLUS怎么用俺就不说了
conn / as sysdba;
alter user hr account unlock;
alter user hr identified by hr;
create table test(c1 varchar2(10),t1 clob);
四、建立JAVA程序
import java.io.IOException;
import java.io.*;
import java.sql.*;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.EncoderException;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Encode {
public static void main(String[] args) throws EncoderException,
DecoderException, IOException, SQLException {
//打开文件
FileInputStream fsin=new FileInputStream("oracle 体系结构.doc");
//看看可以读出多少字节
int fbytes=fsin.available();
//请求分配内存并读入文件到inbuf
byte[] inbuf=new byte[fbytes];
fsin.read(inbuf);
//关闭文件
fsin.close();
//新建一个BASE64编解码对象
Base64 base64 = new Base64();
//对inbuf中的内容进行编码
byte[] bytes = base64.encode(inbuf);
//测试写入数据库
dbwriter.writedb(bytes);
//从数据库读取数据
bytes=dbwriter.readdb();
//将读到的数据解码
byte[] outbuf=base64.decode(bytes);
//将解码后的数据输出到文件output.doc
FileOutputStream fsout=new FileOutputStream("output.doc");
fsout.write(outbuf);
fsout.flush();
fsout.close();
}
}

class dbwriter{
static Connection conn;
//方法一和方法二只能选一个编译
//方法一:使用游标对CLOB型进行操作,此方法网上流传甚广,虽然正确,但无比麻烦,对数据库的操作也很啰嗦
static void writedb(byte[] arg) throws SQLException,IOException
{
// 使用Class对象的forName方法动态加载类
try
{
Class.forName ("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
//连接Oracle
conn = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:student", "hr", "hr");
// @machine:port:SID,    userid,   password
//关闭自动提交,JDBC默认竟然是自动提交,嘿嘿,如果不关闭自动提交,后面更新数据时会出现更新顺序错误,ORACLE的错误号不记得了
conn.setAutoCommit(false);
//插入一行数据,必须先插入一个空的CLOB数据,便于后面获取CLOB的locator                     
PreparedStatement stmt = conn.prepareStatement("insert into test(c1,t1) values ('1',empty_clob())");
stmt.executeUpdate();
//注意SQL语句中的For update,使游标可更新,我对JAVA不熟,应该这样就是可更新游标了吧
stmt=conn.prepareStatement("select t1 from test where c1=? for update");
stmt.setString(1,"1");
ResultSet rset=stmt.executeQuery();
rset.next();
oracle.sql.CLOB lclob=(oracle.sql.CLOB)rset.getClob("t1");
//从CLOB型获取写入流
OutputStream writer = lclob.getAsciiOutputStream();
//将数据写入CLOB
writer.write(arg);
//关闭写入流
writer.close();
//提交等维护工作
conn.commit();
rset.close();
stmt.close();
conn.close();
}
//方法二:使用preparedStatement.setString()方法,比第一种方法简单清楚太多,推荐
static void writedb(byte[] arg) throws SQLException,IOException
{
// 使用Class对象的forName方法动态加载类
try
{
Class.forName ("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
conn = DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:student", "hr", "hr");
// @machine:port:SID,    userid,   password
conn.setAutoCommit(false);                      
PreparedStatement stmt = conn.prepareStatement("insert into test(c1,t1) values ('1',?)");
stmt.setString(1,new String(arg)); //要用10g以后的ojdbc14.jar
stmt.executeUpdate();

conn.commit();
stmt.close();
conn.close();
}

//读数据库的方法
static byte[] readdb() throws SQLException,IOException
{
// 使用Class对象的forName方法动态加载类
try
{
Class.forName ("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
conn = DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:student", "hr", "hr");
// @machine:port:SID,    userid,   password
conn.setAutoCommit(false);                      
PreparedStatement stmt=conn.prepareStatement("select t1 from test where c1=?");
stmt.setString(1,"1");
ResultSet rset=stmt.executeQuery();
rset.next();
String ls=rset.getString("t1");
byte[] rslt=ls.getBytes();
rset.close();
stmt.close();
conn.close();
return rslt;
}
}  

from http://hi.baidu.com/yangyee/blog/item/e8e086ed7e5a1b3cacafd5c9.html

分享到:
评论

相关推荐

    图片存入Oracle中,用clob和blob两种方式

    在数据库管理中,存储非结构化数据如图片、音频或视频文件时,通常会使用`CLOB`(Character Large Object)和`BLOB`(Binary Large Object...`ClobAndBlob`工具提供了一种便捷的方式来体验和比较这两种方式的使用效果。

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    这是因为 WebLogic 服务器为了更好地管理和操作数据库连接,会使用自己的包装类 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 来表示 CLOB 类型的数据,而不是直接使用 Oracle 提供的标准 `oracle.sql.CLOB` 类。...

    JDBC中操作Blob、Clob等对象

    正确地理解和使用这两种类型对于开发能够高效处理大量数据的应用程序至关重要。 #### 二、Apache Derby简介 Apache Derby是一款高质量、纯Java的嵌入式关系数据库引擎,由IBM捐赠给开源社区。Derby基于文件系统,...

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

    在JDBC中,对CLOB数据类型的操作主要包括读取和写入操作。 读取CLOB数据 读取CLOB数据主要通过Java.sql.Clob接口实现。下面是一个基本的读取CLOB数据的示例代码: ```java Connection con = ConnectionFactory....

    JAVA对clob的操作

    JAVA对CLOB的操作 在JAVA中,操作Oracle数据库中的BLOB和CLOB类型字段是一种常见的需求。...通过JDBC和JNDI两种方式可以实现入库和出库操作,但是在实现时需要注意强制转换对象的类型,以便正确地操作BLOB和CLOB字段。

    spring2通过jdbc的方式读取、更新数据库的clob或者blob类型的数据

    这篇博客主要探讨了如何使用Spring处理CLOB(Character Large Object)和BLOB(Binary Large Object)这两种大数据类型的字段。CLOB通常用于存储大文本数据,如文章、报告等,而BLOB则用于存储二进制大数据,如图片...

    Oracle clob和blob在jdbc的应用

    这两种类型用于存储大量的文本数据(CLOB)和二进制数据(BLOB),例如图片、文档或音频文件。在JDBC(Java Database Connectivity)中,我们可以使用特定的方法来操作这些类型的数据。 首先,我们需要建立与数据库...

    Hibernate存储Clob字段的方式总结

    由于Clob字段通常用于存储大量文本数据,如果使用传统的JDBC方式处理,代码将会相当复杂。但随着数据库技术的发展,越来越多的数据库厂商提供了更加简单的方式来操作这些大字段。例如,Oracle数据库提供了支持以...

    解析使用jdbc,hibernate处理clob/blob字段的详解

    这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段。 1. **数据库中的`CLOB`与`BLOB`类型** - 在MySQL中,`CLOB`对应`TEXT`类型,`BLOB`对应`BLOB`类型。 - 在DB2或Oracle...

    关于Clob类型在Hibernate中 的应用小结

    在Hibernate中,Clob类型的字段通常有两种处理方式: 1. **传统JDBC方式**: 在这种模式下,开发者需要直接操作Clob对象,通过PreparedStatement的setClob方法设置Clob值,通过ResultSet的getClob方法获取Clob值。...

    java-deal-the-CLOB-data0.zip_大数据 编程_数据处理

    - 创建`CLOB`对象通常有两种方式:从输入流创建或通过字符串创建。 4. **读取CLOB数据** - 使用`Clob.getSubString()`方法可以从`CLOB`中提取指定位置的子字符串。 - `Clob.length()`返回`CLOB`的长度,`Clob....

    oracle Blob Clob 大数处理 代码

    Clob数据则用`GET_LENGTH`和`SUBSTR`操作。 4. **更新数据**: 更新Blob和Clob数据通常涉及先清除现有数据(`DBMS_LOB.CLEAR`),然后重新插入。也可以直接使用`DBMS_LOB.WRITE`或`DBMS_LOB.CHANGE_LENGTH`进行...

    ActiveXObject和Clob字段的插入更新

    例如,使用Java的JDBC操作Oracle数据库中的Clob字段: ```java // 假设已有连接conn和PreparedStatement ps String sql = "INSERT INTO table_name (clob_column) VALUES (?)"; ps.setClob(1, new java.io.String...

    JDBC说明文档(英文版)

    最后,介绍`Blob`和`Clob`两种高级数据类型,并提供多个示例展示其具体应用。 #### 三、工具与代码片段 教程提供了大量代码片段,帮助理解并实践各种高级操作,包括但不限于: - **数据库创建与设计**:指导如何...

    load blob clob

    在Oracle数据库系统中,Blob和Clob是两种特殊的数据类型,用于存储大对象(Large Object)。Blob主要用于存储二进制数据,如图片、视频或文档,而Clob则用于存储字符型的大数据,如长篇文本或XML文件。本篇文章将...

    java将图片写入数据库,并读出来(blob clob)

    这个过程通常涉及到Blob和Clob数据类型,它们是Java中的两种特殊对象,用于存储大对象(LOB)。Blob用于存储二进制数据,如图片、音频或视频文件,而Clob则用于存储字符数据,比如长文本。以下是如何使用Java处理...

    java中(注解符)处理Clob(blob)类型

    Clob(Character Large OBject)类型和 Blob(Binary Large OBject)类型是数据库中两种常用的大规模数据类型。Clob 类型用于存储大规模的字符数据,而 Blob 类型用于存储大规模的二进制数据。在 Java 中,处理 Clob...

    hibernate保存blob,clob对象

    这篇文章将详细讲解如何在Hibernate中保存这两种特殊类型的数据。 BLOB用于存储二进制大对象,如图片、音频或视频文件等;而CLOB则用于存储字符型的大数据,例如长文本、XML文档等。在Java中,Blob和Clob是JDBC API...

Global site tag (gtag.js) - Google Analytics