`
mxin362642945
  • 浏览: 8490 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle中BLOB字段CRUD

阅读更多

项目中遇到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()上传附件

    在处理“上传附件”功能时,这个接口可能会有一个插入操作,使用 "empty_blob()" 创建一个新的BLOB字段,然后将上传的文件内容存储到这个字段中。 接着是 `ContractTopService.java`。这是一个服务层的实现,它会...

    Hibernate-Oracle-MySQL-image.rar_oracle

    接下来,我们将深入探讨在Hibernate中操作Oracle和MySQL数据库中的Blob字段: 1. **配置Hibernate**:在项目中集成Hibernate,你需要创建一个`hibernate.cfg.xml`配置文件,配置数据库连接信息,包括数据库URL、...

    Delphi oracle 控件

    Delphi Oracle 控件是Delphi开发环境中用于与Oracle数据库交互的一系列组件,这些组件使得开发者能够在Delphi应用程序中轻松地实现对Oracle数据库的CRUD(创建、读取、更新、删除)操作。ODAC(Oracle Data Access ...

    springBoot中mybatis Plus示例

    在本文中,我们将深入探讨如何在SpringBoot应用中集成并使用MyBatis Plus。MyBatis Plus(简称MP)是一个强大的MyBatis扩展,它简化了数据库操作,提供了丰富的CRUD(创建、读取、更新、删除)功能,以及一些实用的...

    JAVA C/S架构应用程序

    6. **文件I/O操作**:为了将图像文件存入BLOB字段和从BLOB字段读取出来,开发者需要进行文件的读写操作。这通常涉及到Java的FileInputStream和FileOutputStream类,或者更高级的IO流操作。 7. **数据库设计**:虽然...

    hibernate保存blob,clob对象

    在上述代码中,`content`字段表示文档内容,可能是一个二进制文件,用BLOB类型表示;`description`字段是文档的长文本描述,用CLOB类型表示。 接下来,我们讨论如何在Hibernate中保存这些对象。通常,你需要先将...

    基于PowerBuilder和Oracle的应用软件开发研究.pdf

    文本可以被输入到Oracle的LONG字段中存储,检索时再从LONG字段中取出显示。文中通过示例展示了如何将文本读入blob变量,处理回车换行符,然后将其存入数据库,以及如何从数据库中提取文本并在MLB中显示。这种方法...

    NHibernate访问oracle,sqlServer实例

    在Oracle中,可能还需要处理Oracle特有的数据类型,如LONG、BLOB等,通过NHibernate的用户类型或者Type映射实现。 对于SQL Server,NHibernate通常会使用SqlClient驱动。配置连接字符串时,你需要提供Server、...

    Oracle表管理.pptx

    本篇主要探讨Oracle中的表管理,包括表空间、数据类型、表的创建与删除、数据完整性和CRUD操作。 首先,表空间是Oracle数据库的核心概念之一。表空间是逻辑存储单元,它由一个或多个数据文件组成,而这些数据文件...

    Oracle表管理相关知识.pptx

    Oracle数据库管理系统是企业级广泛应用的关系型数据库,其中表管理是其核心部分,涉及到表空间、数据类型、数据完整性约束以及对数据的基本操作如创建、读取、更新和删除(CRUD)。下面将详细阐述这些概念。 **表...

    mybatis-generator-1.3.2+使用说明

    MBG 支持多种数据库,如 MySQL、Oracle、SQL Server 等,可以根据数据库方言自动生成相应的 CRUD(创建、读取、更新、删除)操作。 3. **generator.xml**:这是 MBG 的主配置文件,用于定义生成代码的所有细节。在...

    第二章:Oracle数据库表的管理

    主键是表中的一个或一组字段,它的值必须唯一且不能为NULL,用来唯一标识表中的每一行记录。在创建表时,可以添加主键约束,或者后续通过`ALTER TABLE`语句添加。例如,为`student`表添加主键: ```sql ALTER TABLE...

    图片管理系统(毕业设计)

    常见的关系型数据库如MySQL、SQL Server和Oracle都支持BLOB类型字段,用于存储大量的非结构化数据,如图片、音频或视频。在本系统中,图片的二进制数据会被存储在一个专门设计的表中,包含图片ID、用户ID、图片名称...

    仿hibernate动态生成sql保存对象

    在实现过程中,`Oracle字段映射动态`可能指的是针对Oracle数据库的特殊处理,例如Oracle的CLOB和BLOB类型映射,或者考虑Oracle特有的数据类型和特性。确保你的解决方案能适配不同的数据库系统,因为它们可能有不同的...

    数据库重要知识点梳理

    对于大文本类型的数据,可以使用text/blob类型字段进行存储。 日期时间类型字段在数据库中有多种类型,如DATETIME、TIMESTAMP、DATE、YEAR和TIME。每种类型占用不同的存储空间,并有特定的取值范围。例如,DATETIME...

    MySQL.docx

    MySQL是一种流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前隶属于Oracle公司。它以其高效、稳定和开源的特性在各种规模的企业和项目中得到广泛应用。MySQL安装简单,可以通过命令行工具进行登录和操作,...

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

    在Oracle数据库中,Clob是用来存储可变长度的非结构化数据,如长篇文字、HTML文档等。在Java世界中,尤其是在持久化框架Hibernate中,处理Clob类型的数据需要特别的方法和配置。 在Hibernate中,Clob类型的字段通常...

    MySQL中.docx

    例如,MySQL中的`CREATE DATABASE`、`SHOW DATABASES`、`ALTER DATABASE`、`DROP DATABASE`和`USE`等命令用于库的CRUD操作。 1. 创建数据库:使用`CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset...

    SQL生成Java项目

    这个项目可能还包含了对复杂类型的处理,比如自定义序列、触发器、存储过程等,以及对ORACLE特有的数据类型如CLOB、BLOB的支持。此外,可能还支持表间关系的映射,比如一对多、多对一、多对多等。 利用这样的工具,...

    UniDac v6.1.3〖XE7〗

    它提供了丰富的Oracle特性和功能,包括PL/SQL过程、游标、BLOB和CLOB字段处理等,使得开发者能够充分利用Oracle数据库的强大功能。同时,UniDac还支持SQL标准,这意味着它可以处理各种SQL语句,包括复杂的查询、事务...

Global site tag (gtag.js) - Google Analytics