1.没有spring框架,简单jdbc中应用的例子
//这是一个更新操作 /** * 在数据库中插入二进制数据 * @param userid 进行该数据操作的用户名 * @param userip 进行该数据操作的用户ip地址 * @param sql 先进行插入数据库操作的sql语句,二进制字段为EMPTY_CLOB() * @param tablename 进行数据操作的数据表名称 * @param keyfield 用来查找插入记录的条件 * @param clobfield 数据库的二进制字段 * @param clobcontent 要插入clob字段内容 * @return 操作成功返回true,操作失败返回false */ public boolean clobInsert(String userid,String userip,String sql,String tablename,String keyfield,String clobfield,String clobcontent) { try { boolean defaultCommit = conn.getAutoCommit(); conn.setAutoCommit(false); Statement mstmt = conn.createStatement(); mstmt.executeUpdate(sql); String sqltext = "select "+clobfield+" from "+tablename+" where "+keyfield+" for update"; ResultSet rs = mstmt.executeQuery(sqltext); if(rs.next()) { oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(1); clob.putString(1,clobcontent); String msql="update "+tablename+" set "+clobfield+"=? where "+keyfield; PreparedStatement pstmt = conn.prepareStatement(msql); pstmt.setClob(1,clob); pstmt.executeUpdate(); pstmt.close(); } rs.close(); mstmt.close(); conn.commit(); conn.setAutoCommit(defaultCommit); return true; } catch(SQLException ex) { errlogs.writeSyslog(this.getClass().getName()+":"+userid+" "+userip+":clobInsert(String userid,String userip,String sql,String tablename,String keyfield,String clobfield,String clobcontent):SQLException:"+ ex.getMessage()+" sql:"+sql); return false; } }
下面是一个读取流,将流中的内容更新到需要更改的clob字段中
/** * 在数据库中插入二进制数据 * @param userid 进行该数据操作的用户名 * @param userip 进行该数据操作的用户ip地址 * @param sql 先进行插入数据库操作的sql语句,二进制字段为EMPTY_BLOB() * @param tablename 进行数据操作的数据表名称 * @param keyfield 用来查找插入记录的条件 * @param blobfield 数据库的二进制字段 * @param in 要插入数据库的二进制数据流 * @param dbname 数据源名称 * @return 操作成功返回true,操作失败返回false */ public boolean blobInsert(String userid,String userip,String sql,String tablename,String keyfield,String blobfield,BufferedInputStream in,String dbname) { try { Connection m_conn = getConn(dbname); boolean defaultCommit = m_conn.getAutoCommit(); m_conn.setAutoCommit(false); Statement mstmt = m_conn.createStatement(); mstmt.executeUpdate(sql); String sqltext = "select "+blobfield+" from "+tablename+" where "+keyfield+" for update"; ResultSet rs = mstmt.executeQuery(sqltext); if(rs.next()) { oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1); BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); } rs.close(); mstmt.close(); m_conn.commit(); m_conn.setAutoCommit(defaultCommit); return true; } catch(IOException e) { errlogs.writeSyslog(this.getClass().getName()+":"+"blobInsert(String userid,String userip,String sql,String tablename,String keyfield,String blobfield,BufferedInputStream in,String dbname): "+userid+" "+userip+"IOException:"+ e.getMessage()); return false; } catch(SQLException ex) { errlogs.writeSyslog(this.getClass().getName()+":"+userid+" "+userip+":blobInsert(String userid,String userip,String sql,String tablename,String keyfield,String blobfield,BufferedInputStream in,String dbname):SQLException:"+ ex.getMessage()+" sql:"+sql); return false; } }
二。下面是在spring 配置中的应用
<!-- 使用spring+hibernate处理oracle CLOB-->
要想使用spring封装处理CLOB或BLOB字段,就应该先将OraclelobHandler注入到sessionFactory中
<!-- SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 将 LobHandler 注入到 SessionFactory 中 --> <property name="lobHandler"> <ref bean="oracleLobHandler" /> </property>
接下来就是配置oracleLobHandler了 ,分两种情况一种是10g的数据库,一种是9i的数据库
9i的情况
<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
//上面的class如果是c3p0或者其他数据池的情况需要改变class的值
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor" />
</property>
</bean>
10g的情况
(1).声明一个处理句柄:
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />
(2).在sessionFactory中注入lobHandler:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="lobHandler" ref="lobHandler"/>
</bean>
在类中应用
*.hbm.xml配置修改如下:
a:操作blob,java类的成员变量类型设置为byte[],映射文件对应字段类型设置为:
org.springframework.orm.hibernate3.support.BlobByteArrayType
b:操作clob,java类的成员变量类型设置为String,映射文件对应字段类型设置为:
org.springframework.orm.hibernate3.support.ClobStringType
使用的时候不用额外考虑,可以直接象平常使用就可以了。很方便!
业务逻辑层对该字段的操作必须需要在有事务管理的方法中使用,否则会报: