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

Oracle中CLOB字段CRUD

阅读更多

Oracle中CLOB字段CRUD:

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.sql.Clob;
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.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.comtop.top.component.common.systeminit.EnviromentInfo;
import com.comtop.top.core.base.dao.BaseDAO;
import com.comtop.top.demo.content.model.ArticleVO;

/**
 * 内容DAO
 * 
 */
@Service
@Scope(value = "prototype")
public class ArticleDAO extends BaseDAO {
    
    /** 日志对象 */
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    
    /**
     * 新增文章
     * 
     * @param objArticleVO 文章对象
     */
    public void insertArticle(final ArticleVO objArticleVO) {
    	
    	StringBuffer strInsertSQL = new StringBuffer(128);
    	strInsertSQL.append("INSERT INTO TOP_DEMO_ARTICLE ");
    	strInsertSQL.append(" (ARTICLE_ID , MENU_ID , ARTICLE_TITLE , ARTICLE_CONTENT ) ");
    	strInsertSQL.append(" VALUES (?, ?, ?, EMPTY_CLOB()) ");
    	
    	StringBuffer strUpdateSQL = new StringBuffer(128);
    	strUpdateSQL.append("SELECT ARTICLE_CONTENT FROM TOP_DEMO_ARTICLE ");   
    	strUpdateSQL.append(" WHERE  ARTICLE_ID = ? ");
    	
    	 ResultSet objRs = null;
         Connection objConn = null;
         PreparedStatement objPstmt = null;
         Writer objWrite = null;
         Clob objClob = null;
    	try{
    		objConn = this.getConnection();
    		objPstmt = objConn.prepareStatement(strInsertSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    		objPstmt.setString(1, objArticleVO.getArticleId());
    		objPstmt.setString(2, objArticleVO.getMenuId());
    		objPstmt.setString(3, objArticleVO.getArticleTitle());
    		 // 执行新增
    		objPstmt.executeUpdate();
            // 清空objPstmt的SQL语句
    		objPstmt.clearBatch();
            closeConnection(objPstmt);
            //执行写入CLOB
            objPstmt = objConn.prepareStatement(strUpdateSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            objPstmt.setString(1, objArticleVO.getArticleId());
            objRs = objPstmt.executeQuery();
            if(objRs.next()){
            	objClob = objRs.getClob("ARTICLE_CONTENT");
            	objWrite = objClob.setCharacterStream(1);
            	objWrite.write(objArticleVO.getArticleContent());
            	objWrite.flush();
            }
            objClob=null;//清空objClob变量
    	}catch (SQLException ex) {
            logger.error("SQL语句执行错误:" + ",SQL:" + strInsertSQL, ex);
        } catch (IOException ei) {
            logger.error("新增大字段文件时发生异常!" + strUpdateSQL, ei);
        }catch(Exception e){
        	e.printStackTrace();
        }finally {
        	try{
	    		 if(objWrite!=null){
	    			 objWrite.close();
	    		 }
	    		 this.closeConnection(objRs, objPstmt, objConn);
        	}catch(IOException e){
        		logger.error("关闭流对象异常!", e);
        		e.printStackTrace();
        	}
        }
    }
    
    /**
     * 删除文章
     * 
     * @param id 文章ID
     */
    public void deleteArticle(final String menuId) {
        StringBuffer strInsertSQL = new StringBuffer(128);
        strInsertSQL.append("DELETE FROM TOP_DEMO_ARTICLE WHERE  MENU_ID = ? ");
        
        Connection objConn = null;
        PreparedStatement objPstmt = null;
        try {
            objConn = this.getConnection();
            objPstmt =
                objConn.prepareStatement(strInsertSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            objPstmt.setString(1, menuId);
            objPstmt.executeUpdate();
        } catch (SQLException e) {
            logger.error("删除ID = " + menuId + " 的文章失败!", e);
            e.printStackTrace();
        }
    }
    
    /**
     * 更新文章
     * 
     * @param objArticleVO 文章对象
     */
    public void updateArticle(final ArticleVO objArticleVO) {
    	
        StringBuffer strUpdateSQL = new StringBuffer(128);
        strUpdateSQL.append("UPDATE TOP_DEMO_ARTICLE ");
        strUpdateSQL.append(" SET ARTICLE_CONTENT = EMPTY_CLOB() ,  ARTICLE_TITLE = ? "); // 
        strUpdateSQL.append(" WHERE  MENU_ID = ? ");
        
        StringBuffer strNewUpdateSQL = new StringBuffer(128);
        strNewUpdateSQL.append("SELECT ARTICLE_CONTENT FROM TOP_DEMO_ARTICLE ");
        strNewUpdateSQL.append(" WHERE  MENU_ID = ?  FOR UPDATE ");
        
        ResultSet objRs = null;
        Connection objConn = null;
        PreparedStatement objPstmt = null;
        Writer objWrite = null;
        Clob objClob = null;
        try {
            objConn = this.getConnection();
            // 执行清空CLOB字段操作
            objPstmt =
                objConn.prepareStatement(strUpdateSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            objPstmt.setString(1, objArticleVO.getArticleTitle());
            objPstmt.setString(2, objArticleVO.getMenuId());
            // 执行新增
            objPstmt.execute();
            // 清空objPstmt的SQL语句
            objPstmt.clearBatch();
            closeConnection(objPstmt);
            // 执行更新CLOB字段操作
            objPstmt =
                objConn.prepareStatement(strNewUpdateSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            objPstmt.setString(1, objArticleVO.getMenuId());
            objRs = objPstmt.executeQuery();
            if (objRs.next()) {
                objClob = objRs.getClob("ARTICLE_CONTENT");
                objWrite = objClob.setCharacterStream(1);
                objWrite.write(objArticleVO.getArticleContent());
                objWrite.flush();
            } 
            objClob = null;// 清空objClob变量
        } catch (SQLException ex) {
        	ex.printStackTrace();
            logger.error("SQL语句执行错误:" + ",SQL:" + strUpdateSQL, ex);
        } catch (IOException ei) {
        	ei.printStackTrace();
            logger.error("新增大字段文件时发生异常!" + strNewUpdateSQL, ei);
        } finally {
            try {
                if (objWrite != null) {
                    objWrite.close();
                }
                this.closeConnection(objRs, objPstmt, objConn);
            } catch (IOException e) {
                logger.error("关闭流对象异常!", e);
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 
     * @param menuId 菜单ID
     * @return 文章对象
     */
    public ArticleVO querySingleArticle(String menuId){
    	
    	 StringBuffer strSelectSQL = new StringBuffer(128);
         strSelectSQL.append(" SELECT * FROM TOP_DEMO_ARTICLE WHERE MENU_ID=? FOR UPDATE ");
         
         ResultSet objRs = null;
         Connection objConn = null;
         PreparedStatement objPstmt = null;
         Reader objReader = null;
         Clob objClob = null;
         ArticleVO objArticleVO = null;
         try {
             objConn = this.getConnection();
             objPstmt =
                 objConn.prepareStatement(strSelectSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
                     ResultSet.CONCUR_READ_ONLY);
             objPstmt.setString(1, menuId);
             objRs = objPstmt.executeQuery();
             while (objRs.next()) {
                 objArticleVO = new ArticleVO();
                 objArticleVO.setArticleId(objRs.getString("ARTICLE_ID"));
                 objArticleVO.setMenuId(objRs.getString("MENU_ID"));
                 objArticleVO.setArticleTitle(objRs.getString("ARTICLE_TITLE"));
                 objArticleVO.setUpdateTime(objRs.getTimestamp("UPDATE_TIME"));
                 objClob = objRs.getClob("ARTICLE_CONTENT");
                 objReader = objClob.getCharacterStream();
                 char[] cContent = new char[(int) objClob.length()];
                 String strContext = "";
                 while (objReader.read(cContent) != -1) {
                     strContext += String.valueOf(cContent);
                 }
                 objArticleVO.setArticleContent(strContext);
             }
         } catch (SQLException ex) {
             logger.error("SQL语句执行错误:" + ",SQL:" + strSelectSQL, ex);
         } catch (IOException ei) {
             logger.error("新增大字段文件时发生异常!" + strSelectSQL, ei);
         }catch(Exception e){
        	 e.printStackTrace();
         } finally {
             try {
                 if (objReader != null) {
                     objReader.close();
                 }
                 this.closeConnection(objRs, objPstmt, objConn);
             } catch (IOException e) {
                 logger.error("关闭流对象异常!", e);
                 e.printStackTrace();
             }
         }
         
         return objArticleVO;
    }
    
    /**
     * 查询文章对象集合
     * 
     * @return 文章对象集合
     */
    public List<ArticleVO> queryArticleList(String menuId) {
//    	return myBatisDAO.queryList("demo.article.queryArticleList", menuId);
    	
        StringBuffer strSelectSQL = new StringBuffer(128);
        strSelectSQL.append(" SELECT * FORM TOP_DEMO_ARTICLE ");
        
        ResultSet objRs = null;
        Connection objConn = null;
        PreparedStatement objPstmt = null;
        Reader objReader = null;
        Clob objClob = null;
        List<ArticleVO> lstArticleVO = new ArrayList<ArticleVO>(10);
        try {
            objConn = this.getConnection();
            objPstmt =
                objConn.prepareStatement(strSelectSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            objRs = objPstmt.executeQuery();
            ArticleVO objArticleVO = null;
            while (objRs.next()) {
                objArticleVO = new ArticleVO();
                objArticleVO.setArticleId(objRs.getString("ARTICLE_ID"));
                objArticleVO.setMenuId(objRs.getString("MENU_ID"));
                objArticleVO.setArticleTitle(objRs.getString("ARTICLE_TITLE"));
                objArticleVO.setUpdateTime(objRs.getTimestamp("UPDATE_TIME"));
                objClob = objRs.getClob("ARTICLE_CONTENT");
                objReader = objClob.getCharacterStream();
                char[] cContent = new char[(int) objClob.length()];
                String strContext = "";
                while (objReader.read(cContent) != -1) {
                    strContext += String.valueOf(cContent);
                }
                objArticleVO.setArticleContent(strContext);
            }
        } catch (SQLException ex) {
            logger.error("SQL语句执行错误:" + ",SQL:" + strSelectSQL, ex);
        } catch (IOException ei) {
            logger.error("新增大字段文件时发生异常!" + strSelectSQL, ei);
        } finally {
            try {
                if (objReader != null) {
                    objReader.close();
                }
                this.closeConnection(objRs, objPstmt, objConn);
            } catch (IOException e) {
                logger.error("关闭流对象异常!", e);
                e.printStackTrace();
            }
        }
        
        return lstArticleVO;
    }
    
    /**
     * 获取连接
     * 
     * @return conn
     */
    private Connection getConnection() {
        Connection conn = null;
        try {
            conn = ((DataSource) EnviromentInfo.getWebApplicationContext().getBean("dataSource")).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);
            }
        }
    }
}

 

分享到:
评论

相关推荐

    Oracle中CLOB类型文字处理代码

    可能包括了JSP、Servlet或Java后端代码,演示如何在Web应用中与Oracle数据库中的CLOB字段交互,如通过JDBC连接进行CRUD操作。 8. 注意事项: - 管理CLOB数据时要考虑性能,大量读写可能影响效率。 - 避免一次性...

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

    在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...

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

    在Hibernate的XML映射文件中,你需要为这个Clob字段指定映射规则,例如: ```xml &lt;column name="SUMMARY_CLOB" /&gt; ``` **CRUD操作**: 4.2.1 **创建(Create)**: 在创建新记录时,你需要将待存入的文本...

    hibernate保存blob,clob对象

    此外,对于频繁读取的CLOB字段,可以考虑将其索引或部分内容缓存。 最后,虽然Hibernate提供了便捷的接口,但在处理BLOB和CLOB时,还需要了解所用数据库的特性,因为不同的数据库可能有不同的限制和最佳实践。例如...

    基于OO4O和VC 6.0实现Oracle数据库操作.pdf

    4. **OClob** - 用于处理Oracle的大对象(LOB)数据类型,如读写CLOB字段。 **使用OO4O和Visual C++ 6.0进行Oracle数据库操作的基本步骤:** 1. **初始化环境** - 在VC++项目中引用Oracle的OLE DB Provider和OO4O库...

    Oracle表管理.pptx

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

    Oracle表管理相关知识.pptx

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

    仿hibernate动态生成sql保存对象

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

    UniDac v6.1.3〖XE7〗

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

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

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

    SQL生成Java项目

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

    Hibernate学习笔记

    Hibernate是一款广泛应用于Java开发中的ORM(对象关系映射)框架,它的主要目标是简化数据库操作,将数据库的CRUD(创建、读取、更新、删除)操作转化为对Java对象的操作。通过Hibernate,开发者可以避免编写大量的...

    hibernate的一份知识点总结

    - `Session`:处理事务,执行CRUD操作,是非线程安全的,每个业务请求需要一个新的实例。 - `SchemaExport`:用于生成数据库结构。 - `Query`接口:用于执行HQL或SQL查询。 #### 四、对象状态与关系映射 **7. ...

    马士兵java框架hibernate学习笔记

    - **映射配置**:解释如何配置表名、字段名与Java实体类之间的映射关系,以及如何处理特殊数据类型如日期和枚举类型的映射。 #### 五、ID生成策略 - **知识点概述**: - **XML方式**:通过XML映射文件中的`...

Global site tag (gtag.js) - Google Analytics