Java读取/更新Oracle数据库blob字段

在写java程序过程中,如何读取Oracle数据库表某类型为blob的字段?

以下是我在写程序的时候一种解决方法。核心语句。(传上来做了修改,格式不要学习,养成良好习惯)

详细请参考:

读取序列ID:http://blog.csdn.net/yzsind/article/details/6918506

BLOB相关:http://jslfl.iteye.com/blog/1771949

http://www.linuxidc.com/Linux/2011-08/40218.htm

http://xwwccsucn.blog.163.com/blog/static/979145792011925234392/

1. 读取BLOB字段

import oracle.sql.BLOB;

ResultSet rs = ps.executeQuery(sql);

BLOB blob = (BLOB) rs.getBlob("content");

String s = blobToString(blob);

2. blobToString()方法

private String blobToString(BLOB blob) throws SQLException, UnsupportedEncodingException {

long BlobLength; // BLOB字段长度

int i = 1; // 循环变量

byte[] bytes; // BLOB临时存储字节数组

String newStr = ""; // 返回字符串

byte[] msgContent = blob.getBytes(); // BLOB转换为字节数组

BlobLength = blob.length();  //获取BLOB长度

if (msgContent == null || BlobLength == 0) //如果为空,返回空值

{

return "";

} else {

while (i <= BlobLength) //循环处理字符串转换,每次1024;Oracle字符串限制最大4k

{

bytes = blob.getBytes(i, 1024);

i = i + 1024;

newStr = newStr + new String(bytes);

}

}

return newStr;

}

3. update BLOB字段

public void insertData(String task_name, String tast_target) {

int num = 0;

String hql = "insert into table values(sequence_id.nextval,?,EMPTY_BLOB()) returning id into ?";

try {

Connection conn = GlobalData.getConnection();

OraclePreparedStatement ops = (OraclePreparedStatement) conn.prepareStatement(hql);

ops.setString(1, task_name);

ops.registerReturnParameter(2, OracleTypes.NUMBER);

num = ops.executeUpdate();

ResultSet rset = ops.getReturnResultSet(); // rest is not null

long id = 0;

while (rset.next()) {

id = rset.getLong(1);

System.out.println("Insert returnning: " + id);

}

//更新blob字段

Statement bst = conn.createStatement();

ResultSet bset = bst.executeQuery("select tast_target from table  where id=" + id + " FOR UPDATE");

BLOB blob = null;

while (bset.next()) {

blob = ((OracleResultSet) bset).getBLOB(1);

}

final java.io.BufferedOutputStream out = new java.io.BufferedOutputStream(blob.getBinaryOutputStream());//输出流

ByteArrayInputStream streamTemp = null;//输入流

try {

streamTemp = new ByteArrayInputStream(tast_target.getBytes("ISO-8859-1"));

} catch (UnsupportedEncodingException ex) {

Logger.getLogger(OracleGenelDaoImpl.class

.getName()).log(Level.SEVERE, null, ex);

}

byte[] buffer = new byte[1024];//缓冲区

int length = -1;

try {

while ((length = streamTemp.read(buffer)) != -1) {

out.write(buffer, 0, length);

}

streamTemp.close();

out.close();

} catch (IOException ex) {

Logger.getLogger(OracleGenelDaoImpl.class

.getName()).log(Level.SEVERE, null, ex);

}

conn.commit();

ops.close();

bst.close();

} catch (SQLException ex) {

Logger.getLogger(OracleGenelDaoImpl.class

.getName()).log(Level.SEVERE, null, ex);

}

}

时间: 2024-12-29 13:53:58

Java读取/更新Oracle数据库blob字段的相关文章

JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件

******JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件****** package com.bo.test; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import

Oracle数据库BLOB字段的存取

述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对 blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor 用select查询出来

对oracle数据库Blob字段的操作

java实体类 定义类型 byte[] private byte[] str_blob hibernate映射文件类型oracle.sql.BLOB <property name="str_blob" type="oracle.sql.BLOB"> <column name="STR_BLOB" /> </property> 数据库类型BLOB byte[] b = str.getBytes(); String

java PreparedStatement操作oracle数据库

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; //import java.sql.Statement; import java.sql.PreparedStatement; public class lx02{ public static void main(String[] args) throws SQLException, ClassNotFoundException

获取Oracle数据库中字段信息

select t.DATA_PRECISION,t.DATA_SCALE,t.DATA_LENGTH,t.DATA_TYPE,t.COLUMN_NAME, t.NULLABLE,t.DATA_DEFAULT,c.COMMENTS from all_tab_columns t left join all_col_comments c on t.table_name = c.table_name and t.column_name = c.column_name where t.table_name

Java JDBC链接Oracle数据库

package com.test.test; import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法

binlog_format为row格式的时候记录的不是简单的sql,而是实际变更的行,一些大的DML操作,会导致binlog量增加很大,消耗额外的IO.网络资源 可以通过设置binlog_row_image=minimal解决 测试: binlog_row_image默认值是full 对user表进行update 进入binlog里面查看更新记录,binlog日志将所有影响的行都进行了记录 现在将binlog_row_image=minimal 对表中的行进行相同的update操作 再来观察下b

使用java代码编辑oracle数据库

package com.hanqi; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; i

向oracle的blob字段导入文件

在数据库主机上创建测试目录及文件 $mkdir /test $cd /test $echo "Test Subject" >> subject.html $echo "test ok !" >> mail.html 定义文件路径(都是数据库主机上的),并授权 $sqlplus user/[email protected] SQL>create or replace directory send_file_dir as '/test';