web项目spring配置clob字段

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

使用的时候不用额外考虑,可以直接象平常使用就可以了。很方便!

 

业务逻辑层对该字段的操作必须需要在有事务管理的方法中使用,否则会报:

你可能感兴趣的:(spring,bean,Hibernate,Web,项目管理)