IT精英俱樂部

          方便自己查閱,僅此而已!

          統計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          iBATIS操作Blob與Clob淺析

          http://developer.51cto.com/art/200907/136668.htm


          spring 中已經提供了很好的實現,所以這又省去了很多的功夫,接下來看看iBATIS是如何支持Clob和blob的。

          iBATIS提供了TypeHandler接口,用于處理數據類型,基本的實現類為BaseTypeHandler

          在spring 中,提供了AbstractLobTypeHandler作為基礎類,并且提供了相應的模版方法,所有的工作由LobHandler處理。

          BlobByteArrayTypeHandler 主要用于處理blob類型數據,使用byte[]來映射相應的Blob

          ClobStringTypeHandler 用于處理Clob類型數據,使用字符串來映射Clob

          有一點需要注意的是,AbstractLobTypeHandler中實現了事務支持,需要用來釋放相應的資源,所以一定需要在事務環境中進行。

          下面是一個簡單的例子:

          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

          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﹥   
          36.  
          37.  
          38. public interface FoodService {   
          39.  
          40.      
          41. void save(Food food);   
          42. Food get(String id);   
          43. /**   
          44. * @param food   
          45. */   
          46. void update(Food food);   
          47. }   
          48.  
          49. public class FoodServiceImpl implements FoodService {   
          50. private FoodDAO foodDAO;   
          51.  
          52. private DaoCreator creator;   
          53.  
          54. public void setCreator(DaoCreator creator) {   
          55.     this.creator = creator;   
          56. }   
          57.  
          58. protected FoodDAO getFoodDAO() {   
          59.     if (foodDAO == null) {   
          60.    foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);   
          61.     }   
          62.     return foodDAO;   
          63. }   
          64.  
          65. public Food get(String id) {   
          66.     return getFoodDAO().get(id);   
          67. }   
          68. public void save(Food food) {   
          69.     getFoodDAO().save(food);   
          70. }   
          71. public void update(Food food) {   
          72.     getFoodDAO().update(food);   
          73. }   
          74.  
          75. }   
          76.  
          77. spring xml 配置:  
          78.    
          79. 。。。   
          80.  ﹤bean id="lobHandler"   
          81.   class="org.springframework.jdbc.support.lob.DefaultLobHandler"/﹥   
          82.      
          83.    ﹤bean id="transactionManager"   
          84.   class="org.springframework.jdbc.datasource.DataSourceTransactionManager"﹥   
          85.   ﹤property name="dataSource" ref="dataSource"/﹥   
          86.    ﹤/bean﹥   
          87.      
          88.    ﹤bean id="sqlMapClient"   
          89.   class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"﹥   
          90.   ﹤property name="dataSource" ref="dataSource"/﹥   
          91.   ﹤property name="configLocation"﹥   
          92.  ﹤value﹥SqlMapConfig.xml﹤/value﹥   
          93.   ﹤/property﹥   
          94.   ﹤property name="lobHandler" ref="lobHandler"/﹥   
          95.    ﹤/bean﹥   
          96.      
          97.    ﹤bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator"﹥   
          98.   ﹤property name="sqlMapClient" ref="sqlMapClient"/﹥   
          99.    ﹤/bean﹥   
          100.      
          101.    ﹤bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl"﹥   
          102.   ﹤property name="creator" ref="daoCreate"/﹥   
          103.    ﹤/bean﹥   
          104.      
          105.      
          106.    ﹤aop:config﹥   
          107.   ﹤aop:pointcut id="foodServiceMethods"   
          108.  expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/﹥   
          109.   ﹤aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/﹥   
          110.    ﹤/aop:config﹥   
          111.    ﹤tx:advice id="txAdvice" transaction-manager="transactionManager"﹥   
          112.   ﹤tx:attributes﹥   
          113.  ﹤tx:method name="*" propagation="REQUIRED"/﹥   
          114.   ﹤/tx:attributes﹥   
          115.    ﹤/tx:advice﹥  

          簡單的測試:

          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());  

          posted on 2011-07-30 16:35 suplayer 閱讀(328) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 沽源县| 普定县| 济源市| 河津市| 太湖县| 通许县| 遂川县| 九龙城区| 剑阁县| 宣武区| 阜宁县| 罗源县| 修武县| 稻城县| 长寿区| 什邡市| 靖边县| 和田县| 东乡族自治县| 长武县| 宜川县| 茶陵县| 合肥市| 双辽市| 拜城县| 会同县| 晋州市| 延长县| 龙海市| 松桃| 苏州市| 永靖县| 青阳县| 双柏县| 岢岚县| 英德市| 陕西省| 无锡市| 商河县| 余庆县| 龙胜|