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
使用的时候不用额外考虑,可以直接象平常使用就可以了。很方便!
业务逻辑层对该字段的操作必须需要在有事务管理的方法中使用,否则会报: