`

web项目spring配置clob字段

    博客分类:
  • j2ee
阅读更多

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中操作LOB字段案例

    在Spring框架中,LOB(Large Object)字段通常用于存储大数据,如BLOB(Binary Large Object)用于二进制数据,如图片或文档,CLOB(Character Large Object)用于字符数据,如长文本。本篇文章将深入探讨如何在...

    图片存数据库 clob类型

    这是因为数据库中的CLOB字段更适合存储文本数据,而不是二进制数据。下面是一个Java方法,用于将图片文件转换为Byte数组: ```java public byte[] image2byte(String pathName) { byte[] data = null; ...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    ssm 整合+分页

    在"ssm 整合+分页"的项目中,我们不仅能看到这三个框架的基本功能,还能看到一些额外的功能如分页、文件上传下载以及CLOB字段的操作。 首先,Spring框架作为核心,负责管理整个应用的依赖注入(DI)和面向切面编程...

    Spring中文帮助文档

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...

    Spring API

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...

    spring_mvc注解总结

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展且松散耦合的Web应用程序。在本文中,我们将深入探讨Spring MVC中的各种注解,这些注解对于理解和使用Spring MVC至关重要。 1. **@Service**: 这...

    hibernate使用中与各种数据库字段类型对应类型训练

    这通常用于存储图片或大文件,Hibernate用`byte[]`或`org.springframework.web.multipart.MultipartFile`来处理。 7. **CLOB(字符大对象)**:用于存储大量文本数据,如XML文档,对应的Java类型是`java.sql.Clob`...

    使用SSH构建Web应用系统

    1. **LOB字段处理**:SSH提供了处理大对象(LOB)字段的方法,如BLOB和CLOB,确保大数据类型的存储和检索。 2. **文件上传**:SSH框架支持文件上传,通常通过Struts2的上传组件实现,需要注意文件大小限制和安全性...

    ssh 导入导出excel+百度富文本编辑器+highcharts

    开发者需要了解如何在实体类中声明CLOB字段,配置映射,以及如何在服务层进行插入、更新和查询操作。 综合以上,这个案例涵盖了SSH框架的综合应用,包括数据交换与报表(Excel导入导出)、用户界面增强(ueditor)...

    java_学习资料

    - **相关框架引入web工程**:配置Spring、Struts 2和Hibernate之间的协作。 - **把相关对象及对象的关系交给spring管理**:使用Spring进行依赖注入和事务管理。 - **Ssh应用——无刷新分页**:实现不刷新页面即可...

    学术会议管理系统毕业论文.pdf

    文中提及的CLOB(Character Large Object)是一种数据库字段类型,它可以存储大量文本数据。数据库技术在管理会议信息、用户数据等方面起到了核心作用。 17. 编程语言和脚本 诸如VBScript、PHP和Perl等编程语言和...

    把图片以数据的形式保存在数据库 上传图片

    7. **性能优化**:由于将图片保存为数据流可能导致数据库体积增大,影响查询性能,有时会采用BLOB或CLOB字段来存储大对象。但更优的做法是使用文件存储系统(如Amazon S3或自建的文件服务器),只在数据库中存储文件...

Global site tag (gtag.js) - Google Analytics