项目中遇到Orcle的Blob字段:找了很多示例资料饶了不少路,终于调通了。贴出来分享一下!
[code="java"]
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import weblogic.jdbc.vendor.oracle.OracleThinBlob;
import com.comtop.top.iwfc.client.synchronousdata.model.SynchronousDataVO;
/**
* 同步数据DAO
*/
@Service
@Scope(value = "prototype")
public class SynchronousDataDAO {
/** FIXME */
@Resource
private SqlSessionTemplate sqlSessionTemplate;
/** 日志对象 */
protected final Logger logger = LoggerFactory.getLogger(getClass());
/**
* 新增待同步数据对象
*
* @param objSynchronousDataVO 同步数据对象
*/
public void insertSynchronousData(SynchronousDataVO objSynchronousDataVO) {
StringBuffer sbSQL = new StringBuffer(128);
sbSQL.append("INSERT INTO CWF_SYNCHRONOUSDATA ");
sbSQL.append("(ID,SERVICE_ADDRESS,SYNCHRONOUS_DATA,SEND_COUNT)");
sbSQL.append(" VALUES(?,?,EMPTY_BLOB(),?)");
StringBuffer sbSQLUpdate = new StringBuffer(128);
sbSQLUpdate.append("SELECT SYNCHRONOUS_DATA FROM CWF_SYNCHRONOUSDATA ");
sbSQLUpdate.append(" WHERE ID = ? FOR UPDATE");
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 设置数据库连接
conn = getConnection();
// 设置不自动提交事务
// conn.setAutoCommit(false);
pstmt =
conn.prepareStatement(sbSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String strKey = objSynchronousDataVO.getId();
// 设置查询参数
pstmt.setString(1, strKey);
pstmt.setString(2, objSynchronousDataVO.getServiceAddress());
pstmt.setInt(3, objSynchronousDataVO.getSendCount());
// 执行新增
pstmt.executeUpdate();
// 清空pstmt的SQL语句
pstmt.clearBatch();
closeConnection(pstmt);
// 装载插入SYNCHRONOUS_DATA大字段的SQL语句
pstmt =
conn.prepareStatement(sbSQLUpdate.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
pstmt.setString(1, strKey);
rs = pstmt.executeQuery();
if (rs.next()) {
OracleThinBlob blob = (OracleThinBlob) rs.getBlob("SYNCHRONOUS_DATA");
OutputStream outStream = blob.getBinaryOutputStream();
String strSynData = objSynchronousDataVO.getSynchronousData();
byte byteSynData[] = strSynData.getBytes();
outStream.write(byteSynData, 0, byteSynData.length);
outStream.flush();
outStream.close();
}
} catch (SQLException ex) {
logger.error("SQL语句执行错误:" + ",SQL:" + sbSQL, ex);
} catch (IOException ei) {
logger.error("新增大字段文件时发生异常!" + sbSQLUpdate, ei);
} finally {
this.closeConnection(rs, pstmt, conn);
}
}
/**
* 查询所有待同步数据对象
*
* @param objSynchronousDataVO 同步数据对象
* @return 满足条件的待同步数据对象集合
*/
public List queryAllSynchronousData(SynchronousDataVO objSynchronousDataVO) {
// 初始化查询条件
StringBuffer sbSQL = new StringBuffer(128);
sbSQL.append("SELECT * FROM CWF_SYNCHRONOUSDATA ");
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
List lstSynchronousDataVO = null;
SynchronousDataVO objSynData;
try {
// 设置数据库连接
conn = getConnection();
pstmt =
conn.prepareStatement(sbSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// 执行查询
rs = pstmt.executeQuery();
// 确定要查询记录的起始条数
if (rs != null) {
lstSynchronousDataVO = new ArrayList();
while (rs.next()) {
objSynData = new SynchronousDataVO();
objSynData.setId(rs.getString("ID"));
objSynData.setServiceAddress(rs.getString("SERVICE_ADDRESS"));
objSynData.setSendCount(rs.getInt("SEND_COUNT"));
Blob blob = rs.getBlob("SYNCHRONOUS_DATA");
InputStream inStream = blob.getBinaryStream();
if (inStream != null) {
byte[] buff = new byte[1024];
OutputStream outStream = new ByteArrayOutputStream();
int i = 0;
while ((i = inStream.read(buff)) != -1) {
outStream.write(buff, 0, i);
}
objSynData.setSynchronousData(outStream.toString());
inStream.close();
outStream.close();
}
lstSynchronousDataVO.add(objSynData);
}
}
} catch (SQLException ex) {
logger.error("SQL语句执行错误 :" + ",SQL:" + sbSQL, ex);
} catch (IOException ex) {
logger.error("读取SYNCHRONOUS_DATA大字段时发生IO异常", ex);
} finally {
this.closeConnection(rs, pstmt, conn);
}
return lstSynchronousDataVO;
}
/**
* 根据数据编号删除数据
*
* @param objSynchronousDataVO 数据ID
*/
public void deleteSynchronousData(SynchronousDataVO objSynchronousDataVO) {
StringBuffer sbSQL = new StringBuffer(128);
sbSQL.append("DELETE FROM CWF_SYNCHRONOUSDATA ");
sbSQL.append("WHERE ID=?");
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 设置数据库连接
conn = getConnection();
pstmt =
conn.prepareStatement(sbSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String strKey = objSynchronousDataVO.getId();
// 设置查询参数
pstmt.setString(1, strKey);
// 执行新增
pstmt.executeUpdate();
} catch (SQLException ex) {
logger.error("SQL语句执行错误:" + ",SQL:" + sbSQL, ex);
} finally {
this.closeConnection(rs, pstmt, conn);
}
}
/**
* 跟新待同步数据
*
* @param objSynchronousDataVO 同步数据对象
*/
public void updateSynchronousData(SynchronousDataVO objSynchronousDataVO) {
StringBuffer sbSQL = new StringBuffer(128);
sbSQL.append("UPDATE CWF_SYNCHRONOUSDATA SET SEND_COUNT=? ");
sbSQL.append("WHERE ID=?");
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 设置数据库连接
conn = getConnection();
pstmt =
conn.prepareStatement(sbSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String strKey = objSynchronousDataVO.getId();
// 设置查询参数
pstmt.setInt(1, objSynchronousDataVO.getSendCount());
pstmt.setString(2, strKey);
// 执行新增
pstmt.executeUpdate();
} catch (SQLException ex) {
logger.error("SQL语句执行错误:" + ",SQL:" + sbSQL, ex);
} finally {
this.closeConnection(rs, pstmt, conn);
}
}
/**
* 获取连接
*
* @return conn
*/
private Connection getConnection() {
Connection conn = null;
try {
conn = sqlSessionTemplate.getDataSource().getConnection();
} catch (SQLException e) {
logger.error("获取数据库连接失败!", e);
e.printStackTrace();
}
return conn;
}
/**
* 释放DB资源
*
* @param rs ResultSet 结果集
* @param stat Statement 语句对象
* @param conn Connection DB联接
*/
private final void closeConnection(ResultSet rs, PreparedStatement stat, Connection conn) {
this.closeConnection(rs);
this.closeConnection(stat);
this.closeConnection(conn);
}
/**
* 释放DB资源
*
* @param rs ResultSet 结果集
*/
private final void closeConnection(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException ex) {
logger.warn("数据库ResultSet关闭异常.", ex);
}
}
}
/**
* 释放DB资源
*
* @param stat Statement 语句对象
*/
private final void closeConnection(PreparedStatement stat) {
if (stat != null) {
try {
stat.close();
} catch (SQLException ex) {
logger.warn("数据库Statement关闭异常.", ex);
}
}
}
/**
* 释放DB资源
*
* @param conn Connection DB联接
*/
private final void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
logger.error("数据库Connection关闭异常.", ex);
}
}
}
}
相关推荐
在处理“上传附件”功能时,这个接口可能会有一个插入操作,使用 "empty_blob()" 创建一个新的BLOB字段,然后将上传的文件内容存储到这个字段中。 接着是 `ContractTopService.java`。这是一个服务层的实现,它会...
接下来,我们将深入探讨在Hibernate中操作Oracle和MySQL数据库中的Blob字段: 1. **配置Hibernate**:在项目中集成Hibernate,你需要创建一个`hibernate.cfg.xml`配置文件,配置数据库连接信息,包括数据库URL、...
Delphi Oracle 控件是Delphi开发环境中用于与Oracle数据库交互的一系列组件,这些组件使得开发者能够在Delphi应用程序中轻松地实现对Oracle数据库的CRUD(创建、读取、更新、删除)操作。ODAC(Oracle Data Access ...
在本文中,我们将深入探讨如何在SpringBoot应用中集成并使用MyBatis Plus。MyBatis Plus(简称MP)是一个强大的MyBatis扩展,它简化了数据库操作,提供了丰富的CRUD(创建、读取、更新、删除)功能,以及一些实用的...
6. **文件I/O操作**:为了将图像文件存入BLOB字段和从BLOB字段读取出来,开发者需要进行文件的读写操作。这通常涉及到Java的FileInputStream和FileOutputStream类,或者更高级的IO流操作。 7. **数据库设计**:虽然...
在上述代码中,`content`字段表示文档内容,可能是一个二进制文件,用BLOB类型表示;`description`字段是文档的长文本描述,用CLOB类型表示。 接下来,我们讨论如何在Hibernate中保存这些对象。通常,你需要先将...
文本可以被输入到Oracle的LONG字段中存储,检索时再从LONG字段中取出显示。文中通过示例展示了如何将文本读入blob变量,处理回车换行符,然后将其存入数据库,以及如何从数据库中提取文本并在MLB中显示。这种方法...
在Oracle中,可能还需要处理Oracle特有的数据类型,如LONG、BLOB等,通过NHibernate的用户类型或者Type映射实现。 对于SQL Server,NHibernate通常会使用SqlClient驱动。配置连接字符串时,你需要提供Server、...
本篇主要探讨Oracle中的表管理,包括表空间、数据类型、表的创建与删除、数据完整性和CRUD操作。 首先,表空间是Oracle数据库的核心概念之一。表空间是逻辑存储单元,它由一个或多个数据文件组成,而这些数据文件...
Oracle数据库管理系统是企业级广泛应用的关系型数据库,其中表管理是其核心部分,涉及到表空间、数据类型、数据完整性约束以及对数据的基本操作如创建、读取、更新和删除(CRUD)。下面将详细阐述这些概念。 **表...
MBG 支持多种数据库,如 MySQL、Oracle、SQL Server 等,可以根据数据库方言自动生成相应的 CRUD(创建、读取、更新、删除)操作。 3. **generator.xml**:这是 MBG 的主配置文件,用于定义生成代码的所有细节。在...
主键是表中的一个或一组字段,它的值必须唯一且不能为NULL,用来唯一标识表中的每一行记录。在创建表时,可以添加主键约束,或者后续通过`ALTER TABLE`语句添加。例如,为`student`表添加主键: ```sql ALTER TABLE...
常见的关系型数据库如MySQL、SQL Server和Oracle都支持BLOB类型字段,用于存储大量的非结构化数据,如图片、音频或视频。在本系统中,图片的二进制数据会被存储在一个专门设计的表中,包含图片ID、用户ID、图片名称...
在实现过程中,`Oracle字段映射动态`可能指的是针对Oracle数据库的特殊处理,例如Oracle的CLOB和BLOB类型映射,或者考虑Oracle特有的数据类型和特性。确保你的解决方案能适配不同的数据库系统,因为它们可能有不同的...
对于大文本类型的数据,可以使用text/blob类型字段进行存储。 日期时间类型字段在数据库中有多种类型,如DATETIME、TIMESTAMP、DATE、YEAR和TIME。每种类型占用不同的存储空间,并有特定的取值范围。例如,DATETIME...
MySQL是一种流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前隶属于Oracle公司。它以其高效、稳定和开源的特性在各种规模的企业和项目中得到广泛应用。MySQL安装简单,可以通过命令行工具进行登录和操作,...
在Oracle数据库中,Clob是用来存储可变长度的非结构化数据,如长篇文字、HTML文档等。在Java世界中,尤其是在持久化框架Hibernate中,处理Clob类型的数据需要特别的方法和配置。 在Hibernate中,Clob类型的字段通常...
例如,MySQL中的`CREATE DATABASE`、`SHOW DATABASES`、`ALTER DATABASE`、`DROP DATABASE`和`USE`等命令用于库的CRUD操作。 1. 创建数据库:使用`CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset...
这个项目可能还包含了对复杂类型的处理,比如自定义序列、触发器、存储过程等,以及对ORACLE特有的数据类型如CLOB、BLOB的支持。此外,可能还支持表间关系的映射,比如一对多、多对一、多对多等。 利用这样的工具,...
它提供了丰富的Oracle特性和功能,包括PL/SQL过程、游标、BLOB和CLOB字段处理等,使得开发者能够充分利用Oracle数据库的强大功能。同时,UniDac还支持SQL标准,这意味着它可以处理各种SQL语句,包括复杂的查询、事务...