ibatis怎么支持clob 和blob
ibatis如何支持clob 和blob??? 这几天仔细看了一下ibatis的文档,发现2.2后,ibatis的改变还是挺大的。对于自
ibatis如何支持clob 和blob
??? 这几天仔细看了一下ibatis的文档,发现2.2后,ibatis的改变还是挺大的。对于自定义类型支持的也不错,这样对于blob和clob数据的处理也就简单多了。
??? 不过在spring 中已经提供了很好的实现,所以这又省去了很多的功夫,接下来看看ibatis是如何支持clob和blob的。
??? ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler
??? 在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。
??? BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob
??? ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob
??? 有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。
下面是一个简单的例子:
java 代码?
- public?class?Food?{??
- ????private?String?content;??
- ??
- ????private?String?id;??
- ??
- ????private?byte[]?image;??
- ??
- ????private?String?name;??????
- ????????...??
- }??
xml如下:说明一下,在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中,可以通过handler来定义相应的typeHandler
xml 代码?
- <sqlMap?namespace="Food">??
- ??????
- ????<typeAlias?alias="Food"?type="org.esoft.hdb.bo.Food"/>??
- ????<resultMap?id="foodResult"?class="Food">??
- ????????<result?property="id"?column="C_ID"/>??
- ????????<result?property="name"?column="C_NAME"/>??
- ????????<result?property="content"?column="C_content"??
- ????????????typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>??
- ????????<result?property="image"?column="C_image"??
- ????????????typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>??
- ????</resultMap>??
- ????<sql?id="foodFragment">select?C_ID,C_NAME,C_CONTENT,C_IMAGE?from?T_FOOD</sql>??
- ????????<select?id="getAll"?resultMap="foodResult">??
- ????????<include?refid="foodFragment"/>??
- ????</select>??
- ????<select?id="selectById"?parameterClass="string"?resultMap="foodResult">??
- ????????<include?refid="foodFragment"/>?where?C_ID=#id#</select>??
- ??????
- ????<insert?id="insert"?parameterClass="Food">?insert?into?T_FOOD?(?C_ID,??
- ????????C_NAME,C_CONTENT,?C_IMAGE)?values?(?#id#,??
- ????????#name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,??
- ????????#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)??
- ????????</insert>??
- ??????
- ????<update?id="update"?parameterClass="Food">?update?T_FOOD?set?C_NAME?=?#name#,??
- ????????C_CONTENT?=??
- ????????#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,??
- ????????C_IMAGE?=??
- ????????#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#??
- ????????where?C_ID?=?#id#?</update>??
- ??????
- ????<delete?id="deleteById"?parameterClass="string">?delete?from?T_FOOD?where?C_ID?=?#id#??
- ????????</delete>??
- ??????
- </sqlMap>??
java 代码?
- public?interface?FoodService?{??
- ??
- ??????
- ????void?save(Food?food);??
- ????Food?get(String?id);??
- ????/**?
- ?????*?@param?food?
- ?????*/??
- ????void?update(Food?food);??
- }??
- ??
- public?class?FoodServiceImpl?implements?FoodService?{??
- ?????private?FoodDAO?foodDAO;??
- ??
- ????private?DaoCreator?creator;??
- ??
- ????public?void?setCreator(DaoCreator?creator)?{??
- ????????this.creator?=?creator;??
- ????}??
- ??
- ????protected?FoodDAO?getFoodDAO()?{??
- ????????if?(foodDAO?==?null)?{??
- ????????????foodDAO?=?(FoodDAO)?creator.createDao(FoodDAO.class,?Food.class);??
- ????????}??
- ????????return?foodDAO;??
- ????}??
- ??
- ????public?Food?get(String?id)?{??
- ????????return?getFoodDAO().get(id);??
- ????}??
- ????public?void?save(Food?food)?{??
- ????????getFoodDAO().save(food);??
- ????}??
- ????public?void?update(Food?food)?{??
- ????????getFoodDAO().update(food);??
- ????}??
- ??
- }??
spring xml 配置:
xml 代码?
- 。。。??
- ??????????<bean?id="lobHandler"??
- ????????class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>??
- ??????
- ????<bean?id="transactionManager"??
- ????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
- ????????<property?name="dataSource"?ref="dataSource"/>??
- ????</bean>??
- ??????
- ????<bean?id="sqlMapClient"??
- ????????class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">??
- ????????<property?name="dataSource"?ref="dataSource"/>??
- ????????<property?name="configLocation">??
- ????????????<value>SqlMapConfig.xml</value>??
- ????????</property>??
- ????????<property?name="lobHandler"?ref="lobHandler"/>??
- ????</bean>??
- ??????
- ????<bean?id="daoCreate"?class="org.esoft.hdb.ibatis.IbatisDaoCreator">??
- ????????<property?name="sqlMapClient"?ref="sqlMapClient"/>??
- ????</bean>??
- ??????
- ????<bean?id="foodService"?class="org.esoft.hdb.service.FoodServiceImpl">??
- ????????<property?name="creator"?ref="daoCreate"/>??
- ????</bean>??
- ??????
- ??????
- ????<aop:config>??
- ????????<aop:pointcut?id="foodServiceMethods"??
- ????????????expression="execution(*?org.esoft.hdb.service.FoodService.*(..))"/>??
- ????????<aop:advisor?advice-ref="txAdvice"?pointcut-ref="foodServiceMethods"/>??
- ????</aop:config>??
- ????<tx:advice?id="txAdvice"?transaction-manager="transactionManager">??
- ????????<tx:attributes>??
- ????????????<tx:method?name="*"?propagation="REQUIRED"/>??
- ????????</tx:attributes>??
- ????</tx:advice>??
简单的测试:
java 代码?
- save?:??
- ????????Food?food?=?new?Food();??
- ????????food.setPk("1");??
- ????????food.setName("food1");??
- ????????BufferedInputStream?in?=?new?BufferedInputStream(getClass()??
- ????????????????.getResourceAsStream("/1.gif"));??
- ????????byte[]?b?=?FileCopyUtils.copyToByteArray(in);??
- ????????food.setImage(b);??
- ????????????????in?=?new?BufferedInputStream(getClass().getResourceAsStream(??
- ????????????????"/hibernate.cfg.xml"));??
- ????????b?=?FileCopyUtils.copyToByteArray(in);??
- ????????food.setContent(new?String(b));??
- ????????foodService.save(food);??
- update:??
- ??????????????Food?food?=?foodService.get("1");??
- ????????BufferedInputStream?in?=?new?BufferedInputStream(getClass()??
- ????????????????.getResourceAsStream("/jdbc.properties"));??
- ????????byte[]?b?=?FileCopyUtils.copyToByteArray(in);??
- ????????food.setContent(new?String(b));??
- ????????foodService.update(food);??
- ????????food?=?foodService.get("1");??
- ????????assertNotNull(food.getImage());??
1 楼 宏基小键盘 2007-01-15 不错的帖子,学到了。不过我们在系统中取Clob时,直接将其映射成string(oracle 10.0.2),也没有什么问题。但是update和insert时没有测试过。会不会和jdbc driver也有关系呢? 2 楼 zyl 2007-01-15 恩,跟jdbc driver有很大关系。oracle 10.0.2好像已经作了很大的改变,以前9i老是会报错。 3 楼 宏基小键盘 2007-01-15 <p><font>在resultmap或inline resultmap中引用长长的typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"是一件很烦的事,翻了下最新文档(2006.11.30),没有发现,今天下了个sql-map-config-2.dtd,在里面有新的发现,楼主帮忙测试下,如果这种方式可行,配置应该会少很多。</font></p>
<p>晕死,代码中加XML出来老是很乱。</p>
<p>楼主自己下载这个文件:<font><a href='http://ibatis.apache.org/dtd/sql-map-config-2.dtd'>http://ibatis.apache.org/dtd/sql-map-config-2.dtd</a></font></p>
<p>然后看看里面有TypeHandler的配置节。</p> 4 楼 zyl 2007-01-15 应该可行,这是在全局配置文件中,进行声明typehandler ,不过好像需要callback.
实在太长,就用typealise定义简单的类型,应该可以吧。 5 楼 宏基小键盘 2007-01-17 Oracle
BLOBs/CLOBs
As of release 2.0.9, iBATIS includes default BLOB/CLOB handlers. If you are using an older version of Oracle (pre-10g), then you might have to write your own Custom Tag Handler to access the proprietary Oracle API to work with LOBs.
原来如此。
6 楼 zyl 2007-01-18 看来你的文档看的很仔细,精神可嘉