这段时间经常接触到需要对clob和blob字段进行操作的情况,顺便总结一下。
很多情况下我们都需要对数据库中的clob和blob字段进行操作。比如在oracle下,按照我们以前的做法,一般如下:
1)用insert语句插入一个empty_clob()或者empty_blob(),这里是为了让数据库可以分配一个空的clob或blob;
2)接着我们需要从数据库中直接select from XXX for update,这里记住需要加update,至于不加update会有什么错误,大家可以试试,这里就不截图了。
3)然后我们通过rs.getClob(XXX)或者rs.getBlob(XXX),其中的XXX为字段名或索引,记住这里取到的clob和blob不是数据库相关的。即是java.sql.Clob和java.sql.Blob。
4)然后我们再通过相关的流设置来进行设值。
一共需要四步,麻烦不,其实说麻烦也不麻烦,但说简单也不简单,非要插入一个空的,然后才设值,有点奇怪,但也是没办法的,谁叫数据库不是我们自己开发的。
下面我们直接来看看一个小例子,实现一个上面的步骤,即“以前的做法”。
public class TestClob {
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","3367446");
//这里先插入一个空的clob,后面需要取出来进行更新
PreparedStatement pstat = conn.prepareStatement("insert into test_clob(id,bigstring) values(1,empty_clob())");
pstat.executeUpdate();
pstat.close();
conn.setAutoCommit(false);
pstat = conn.prepareStatement("select bigstring from test_clob where id=1 for update");
ResultSet rs = pstat.executeQuery();
while(rs.next()) {
Clob clob = rs.getClob("bigstring");
//这里最重要,写入clob
Writer writer = clob.setCharacterStream(0);
BufferedWriter bw = new BufferedWriter(writer);
bw.write("I'm the test string");
//记得要关闭,或者flush,否则看不到效果
bw.close();
conn.commit();
}
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
当我们执行后,看看效果:
这个例子应该都看得明白吧,blob也跟这个类似,不同的是BLOB的写入方式有点不同。
PreparedStatement pstat = conn.prepareStatement("insert into test_clob(id,bigblob) values(3,empty_blob())");
pstat.executeUpdate();
pstat.close();
conn.setAutoCommit(false);
pstat = conn.prepareStatement("select bigblob from test_clob where id=2 for update");
ResultSet rs = pstat.executeQuery();
while(rs.next()) {
Blob blob = rs.getBlob("bigblob");
//这里最重要,写入blob
OutputStream out = blob.setBinaryStream(0);
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\img0.jpg");
int length = 0;
byte[] bytes = new byte[1024];
while((length = fis.read(bytes)) != -1) {
out.write(bytes,0,length);
}
//记得要关闭,或者flush,否则看不到效果
out.close();
conn.commit();
}
conn.setAutoCommit(true);
而clob我们测试后,效果为:
表的结构如下:
前面我们称这种方法是旧方法,那现在我们用新的方法试试,当然这个新方法需要用到新包,可以到oracle官网下载:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html下载ojdbc6.jar
新的代码如下:
PreparedStatement pstat = conn.prepareStatement("insert into test_clob(id,bigblob) values(3,?)");
Blob blob = conn.createBlob();
OutputStream out = blob.setBinaryStream(0);
FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\2000.gif"));
int length = 0;
byte[] bytes = new byte[4096];
while((length = fis.read(bytes)) != -1) {
out.write(bytes);
}
out.close();
pstat.setBlob(1,blob);
pstat.executeUpdate();
CLOB字段也类似,大家可以自行尝试。
可以看到,现在的操作已经省去了开始的第一步插入空的clob或blob了,而最后我们所要加的一句就是setBlob或setClob把相应的参数设到相应的参数位上。当然这个要求我们用preparedStatement,以此来使用参数。
这个是JDBC新标准的做法,由于我一般情况下只用oracle,mysql暂时没测试,大家可以看看是不是也是这样。
- 大小: 3.4 KB
- 大小: 1.4 KB
- 大小: 150.7 KB
分享到:
相关推荐
在Java编程中,Oracle数据库提供了对大型对象(Large Object)的支持,包括CLOB(Character Large Object)和BLOB(Binary Large Object)。这两种类型用于存储大量的文本数据(CLOB)和二进制数据(BLOB),例如...
JDBC实现对CLOB和BLOB数据类型的操作 在数据库中,存在两种类型的数据:CLOB(Character Large OBject)和BLOB(Binary Large OBject),它们用于存储大型数据,如文本、图片、音频、视频等。对CLOB和BLOB数据类型...
接下来是一个具体的示例,展示了如何使用JDBC操作包含Blob和Clob字段的数据库表。 1. **创建包含Blob和Clob字段的表**: ```java String url = "jdbc:derby:clobberyclob;create=true"; Class.forName("org....
例如,Oracle的ojdbc驱动程序提供了对Clob和Blob的高效操作。你可以通过以下方式配置Hibernate的JDBC连接: ```xml ... <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver ...
总的来说,Spring通过JDBC提供了一套完善的接口和工具类来处理CLOB和BLOB,使得开发者无需直接与JDBC API打交道,降低了数据库操作的复杂度。在实际项目中,根据业务需求,合理运用这些功能可以极大地提高开发效率和...
Java 中处理 Clob 和 Blob 类型的注解配置 ...处理 Clob 和 Blob 类型需要正确地配置注解和相关的配置信息,以确保正确地读取和写入数据。同时,需要注意常见的问题和性能问题,以确保系统的稳定性和性能。
对于CLOB和BLOB字段,Oracle JDBC驱动提供了`oracle.jdbc.driver.OracleClob`和`oracle.jdbc.driver.OracleBlob`类,它们实现了Java的标准接口`java.sql.Clob`和`java.sql.Blob`。这两个接口提供了读取和写入大数据...
本文将详细介绍如何使用JDBC来操作Blob和Clob对象,包括创建含有Blob和Clob字段的表、插入和读取Blob/Clob数据的具体步骤。 #### 二、Derby简介 Apache Derby是一款高质量的、纯Java的嵌入式关系数据库引擎。它...
在数据库管理中,存储非结构化数据如图片、音频或视频文件时,通常会使用`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)这两种数据类型。Oracle数据库系统支持这两种数据类型,用于存储大量文本...
在Java的数据库编程中,JDBC(Java Database Connectivity)是一个重要的接口,用于与各种数据库进行交互。当涉及到处理大型对象...无论是直接使用JDBC还是结合ORM框架,都可以灵活地实现对Blob和Clob的读写操作。
标题“jdbc_blob_clob.rar”暗示了这个压缩包文件包含的内容与Java Database Connectivity (JDBC) 中处理Blob和Clob对象相关的知识。Blob是Binary Large Object的缩写,用于存储大块二进制数据,如图片、音频或视频...
JDBC读写Oracle的CLOB字段
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
以下是对Oracle中Clob和Blob数据存取的Java代码示例及详细解释。 首先,确保你的项目已经引入了Oracle JDBC驱动(如ojdbc.jar)。然后,你需要创建一个与Oracle数据库的连接,这通常通过`DriverManager.get...
在Java的数据库操作中,`CLOB`和`BLOB`是用于存储大对象(Large Object)的数据类型,分别用于存储字符数据和二进制数据。这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段...
在IT行业中,数据库操作是必不可少的一部分,特别是在处理大数据量或者特殊数据类型如CLOB(Character Large Object)和BLOB(Binary Large Object)时。BBoss Persistent是一个轻量级的持久层框架,它提供了方便的...
因此,本文旨在总结JAVA对Oracle中BLOB、CLOB类型字段的操作,包括入库和出库操作的实现细节。 一、BLOB操作 1. 入库 在JAVA中,入库操作可以通过JDBC和JNDI两种方式实现。下面是入库操作的详细实现步骤: (1)...