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); } } } }
相关推荐
可能包括了JSP、Servlet或Java后端代码,演示如何在Web应用中与Oracle数据库中的CLOB字段交互,如通过JDBC连接进行CRUD操作。 8. 注意事项: - 管理CLOB数据时要考虑性能,大量读写可能影响效率。 - 避免一次性...
在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...
在Hibernate的XML映射文件中,你需要为这个Clob字段指定映射规则,例如: ```xml <column name="SUMMARY_CLOB" /> ``` **CRUD操作**: 4.2.1 **创建(Create)**: 在创建新记录时,你需要将待存入的文本...
此外,对于频繁读取的CLOB字段,可以考虑将其索引或部分内容缓存。 最后,虽然Hibernate提供了便捷的接口,但在处理BLOB和CLOB时,还需要了解所用数据库的特性,因为不同的数据库可能有不同的限制和最佳实践。例如...
4. **OClob** - 用于处理Oracle的大对象(LOB)数据类型,如读写CLOB字段。 **使用OO4O和Visual C++ 6.0进行Oracle数据库操作的基本步骤:** 1. **初始化环境** - 在VC++项目中引用Oracle的OLE DB Provider和OO4O库...
本篇主要探讨Oracle中的表管理,包括表空间、数据类型、表的创建与删除、数据完整性和CRUD操作。 首先,表空间是Oracle数据库的核心概念之一。表空间是逻辑存储单元,它由一个或多个数据文件组成,而这些数据文件...
Oracle数据库管理系统是企业级广泛应用的关系型数据库,其中表管理是其核心部分,涉及到表空间、数据类型、数据完整性约束以及对数据的基本操作如创建、读取、更新和删除(CRUD)。下面将详细阐述这些概念。 **表...
在实现过程中,`Oracle字段映射动态`可能指的是针对Oracle数据库的特殊处理,例如Oracle的CLOB和BLOB类型映射,或者考虑Oracle特有的数据类型和特性。确保你的解决方案能适配不同的数据库系统,因为它们可能有不同的...
它提供了丰富的Oracle特性和功能,包括PL/SQL过程、游标、BLOB和CLOB字段处理等,使得开发者能够充分利用Oracle数据库的强大功能。同时,UniDac还支持SQL标准,这意味着它可以处理各种SQL语句,包括复杂的查询、事务...
主键是表中的一个或一组字段,它的值必须唯一且不能为NULL,用来唯一标识表中的每一行记录。在创建表时,可以添加主键约束,或者后续通过`ALTER TABLE`语句添加。例如,为`student`表添加主键: ```sql ALTER TABLE...
这个项目可能还包含了对复杂类型的处理,比如自定义序列、触发器、存储过程等,以及对ORACLE特有的数据类型如CLOB、BLOB的支持。此外,可能还支持表间关系的映射,比如一对多、多对一、多对多等。 利用这样的工具,...
Hibernate是一款广泛应用于Java开发中的ORM(对象关系映射)框架,它的主要目标是简化数据库操作,将数据库的CRUD(创建、读取、更新、删除)操作转化为对Java对象的操作。通过Hibernate,开发者可以避免编写大量的...
- `Session`:处理事务,执行CRUD操作,是非线程安全的,每个业务请求需要一个新的实例。 - `SchemaExport`:用于生成数据库结构。 - `Query`接口:用于执行HQL或SQL查询。 #### 四、对象状态与关系映射 **7. ...
- **映射配置**:解释如何配置表名、字段名与Java实体类之间的映射关系,以及如何处理特殊数据类型如日期和枚举类型的映射。 #### 五、ID生成策略 - **知识点概述**: - **XML方式**:通过XML映射文件中的`...