这段时间经常接触到需要对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
分享到:
相关推荐
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。
JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等...
clob和blob在jdbc的应用~~~~~~
JDBC中操作Blob、Clob等对象
主要介绍了详解jdbc实现对CLOB和BLOB数据类型的操作的相关资料,这里实现写入操作与读写操作,需要的朋友可以参考下
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
JDBC读写Oracle的CLOB字段
oracle的jdbc驱动程序,用这个版本的操作Clob,blob类型的数据很方便。 博文链接:https://zhenjw.iteye.com/blog/173419
本篇是对使用jdbc,hibernate处理clob/blob字段进行了详细的分析介绍,需要的朋友参考下
weblogic下转换oracle 的clob类型经常报转型错误,本例子通过反射解决weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB转型成oracle.sql.CLOB问题
NULL 博文链接:https://coolzhi.iteye.com/blog/586186
NULL 博文链接:https://53873039oycg.iteye.com/blog/2009996
NULL 博文链接:https://yangy608.iteye.com/blog/690741
JDBC(Java Database Connectivity)可以为多种关系型数据库提供统一的访问操作接口。 JDBC API:提供各种访问操作接口。 Driver:数据库的驱动程序一般由第三方提供: Oracle ojdbc-x.jar MySQL mysql-connector-java-...
rt,出现这种情况,可以更换下hibernate核心包 即可解决
用hibernate和jdbc读存blob或clob
jdbc基础,包含基本概念、数据库连接操作、JDBC常用接口、与oracle/mysql/db2创建连接、Statement、PreparedStatement会话使用、Clob/Blob大文件处理、批处理操作等。
anysql 免费工具合集 为方便使用 留存