首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

ibatis怎么支持clob 和blob

2012-11-09 
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 代码?

  1. public?class?Food?{??
  2. ????private?String?content;??
  3. ??
  4. ????private?String?id;??
  5. ??
  6. ????private?byte[]?image;??
  7. ??
  8. ????private?String?name;??????
  9. ????????...??
  10. }??


xml如下:说明一下,在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中,可以通过handler来定义相应的typeHandler
xml 代码?
  1. <sqlMap?namespace="Food">??
  2. ??????
  3. ????<typeAlias?alias="Food"?type="org.esoft.hdb.bo.Food"/>??
  4. ????<resultMap?id="foodResult"?class="Food">??
  5. ????????<result?property="id"?column="C_ID"/>??
  6. ????????<result?property="name"?column="C_NAME"/>??
  7. ????????<result?property="content"?column="C_content"??
  8. ????????????typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>??
  9. ????????<result?property="image"?column="C_image"??
  10. ????????????typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>??
  11. ????</resultMap>??
  12. ????<sql?id="foodFragment">select?C_ID,C_NAME,C_CONTENT,C_IMAGE?from?T_FOOD</sql>??
  13. ????????<select?id="getAll"?resultMap="foodResult">??
  14. ????????<include?refid="foodFragment"/>??
  15. ????</select>??
  16. ????<select?id="selectById"?parameterClass="string"?resultMap="foodResult">??
  17. ????????<include?refid="foodFragment"/>?where?C_ID=#id#</select>??
  18. ??????
  19. ????<insert?id="insert"?parameterClass="Food">?insert?into?T_FOOD?(?C_ID,??
  20. ????????C_NAME,C_CONTENT,?C_IMAGE)?values?(?#id#,??
  21. ????????#name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,??
  22. ????????#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)??
  23. ????????</insert>??
  24. ??????
  25. ????<update?id="update"?parameterClass="Food">?update?T_FOOD?set?C_NAME?=?#name#,??
  26. ????????C_CONTENT?=??
  27. ????????#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,??
  28. ????????C_IMAGE?=??
  29. ????????#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#??
  30. ????????where?C_ID?=?#id#?</update>??
  31. ??????
  32. ????<delete?id="deleteById"?parameterClass="string">?delete?from?T_FOOD?where?C_ID?=?#id#??
  33. ????????</delete>??
  34. ??????
  35. </sqlMap>??


java 代码?
  1. public?interface?FoodService?{??
  2. ??
  3. ??????
  4. ????void?save(Food?food);??
  5. ????Food?get(String?id);??
  6. ????/**?
  7. ?????*?@param?food?
  8. ?????*/??
  9. ????void?update(Food?food);??
  10. }??
  11. ??
  12. public?class?FoodServiceImpl?implements?FoodService?{??
  13. ?????private?FoodDAO?foodDAO;??
  14. ??
  15. ????private?DaoCreator?creator;??
  16. ??
  17. ????public?void?setCreator(DaoCreator?creator)?{??
  18. ????????this.creator?=?creator;??
  19. ????}??
  20. ??
  21. ????protected?FoodDAO?getFoodDAO()?{??
  22. ????????if?(foodDAO?==?null)?{??
  23. ????????????foodDAO?=?(FoodDAO)?creator.createDao(FoodDAO.class,?Food.class);??
  24. ????????}??
  25. ????????return?foodDAO;??
  26. ????}??
  27. ??
  28. ????public?Food?get(String?id)?{??
  29. ????????return?getFoodDAO().get(id);??
  30. ????}??
  31. ????public?void?save(Food?food)?{??
  32. ????????getFoodDAO().save(food);??
  33. ????}??
  34. ????public?void?update(Food?food)?{??
  35. ????????getFoodDAO().update(food);??
  36. ????}??
  37. ??
  38. }??


spring xml 配置:
xml 代码?
  1. 。。。??
  2. ??????????<bean?id="lobHandler"??
  3. ????????class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>??
  4. ??????
  5. ????<bean?id="transactionManager"??
  6. ????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
  7. ????????<property?name="dataSource"?ref="dataSource"/>??
  8. ????</bean>??
  9. ??????
  10. ????<bean?id="sqlMapClient"??
  11. ????????class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">??
  12. ????????<property?name="dataSource"?ref="dataSource"/>??
  13. ????????<property?name="configLocation">??
  14. ????????????<value>SqlMapConfig.xml</value>??
  15. ????????</property>??
  16. ????????<property?name="lobHandler"?ref="lobHandler"/>??
  17. ????</bean>??
  18. ??????
  19. ????<bean?id="daoCreate"?class="org.esoft.hdb.ibatis.IbatisDaoCreator">??
  20. ????????<property?name="sqlMapClient"?ref="sqlMapClient"/>??
  21. ????</bean>??
  22. ??????
  23. ????<bean?id="foodService"?class="org.esoft.hdb.service.FoodServiceImpl">??
  24. ????????<property?name="creator"?ref="daoCreate"/>??
  25. ????</bean>??
  26. ??????
  27. ??????
  28. ????<aop:config>??
  29. ????????<aop:pointcut?id="foodServiceMethods"??
  30. ????????????expression="execution(*?org.esoft.hdb.service.FoodService.*(..))"/>??
  31. ????????<aop:advisor?advice-ref="txAdvice"?pointcut-ref="foodServiceMethods"/>??
  32. ????</aop:config>??
  33. ????<tx:advice?id="txAdvice"?transaction-manager="transactionManager">??
  34. ????????<tx:attributes>??
  35. ????????????<tx:method?name="*"?propagation="REQUIRED"/>??
  36. ????????</tx:attributes>??
  37. ????</tx:advice>??


简单的测试:
java 代码?
  1. save?:??
  2. ????????Food?food?=?new?Food();??
  3. ????????food.setPk("1");??
  4. ????????food.setName("food1");??
  5. ????????BufferedInputStream?in?=?new?BufferedInputStream(getClass()??
  6. ????????????????.getResourceAsStream("/1.gif"));??
  7. ????????byte[]?b?=?FileCopyUtils.copyToByteArray(in);??
  8. ????????food.setImage(b);??
  9. ????????????????in?=?new?BufferedInputStream(getClass().getResourceAsStream(??
  10. ????????????????"/hibernate.cfg.xml"));??
  11. ????????b?=?FileCopyUtils.copyToByteArray(in);??
  12. ????????food.setContent(new?String(b));??
  13. ????????foodService.save(food);??
  14. update:??
  15. ??????????????Food?food?=?foodService.get("1");??
  16. ????????BufferedInputStream?in?=?new?BufferedInputStream(getClass()??
  17. ????????????????.getResourceAsStream("/jdbc.properties"));??
  18. ????????byte[]?b?=?FileCopyUtils.copyToByteArray(in);??
  19. ????????food.setContent(new?String(b));??
  20. ????????foodService.update(food);??
  21. ????????food?=?foodService.get("1");??
  22. ????????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   看来你的文档看的很仔细,精神可嘉

热点排行