閑人野居
          好好學習,天天向上
          posts - 57,  comments - 137,  trackbacks - 0
          ??? 這幾天仔細看了一下ibatis的文檔,發現2.2后,ibatis的改變還是挺大的。對于自定義類型支持的也不錯,這樣對于blob和clob數據的處理也就簡單多了。
          ??? 不過在spring 中已經提供了很好的實現,所以這又省去了很多的功夫,接下來看看ibatis是如何支持clob和blob的。

          ??? ibatis提供了TypeHandler接口,用于處理數據類型,基本的實現類為BaseTypeHandler
          ??? 在spring 中,提供了AbstractLobTypeHandler作為基礎類,并且提供了相應的模版方法,所有的工作由LobHandler處理。
          ??? BlobByteArrayTypeHandler 主要用于處理blob類型數據,使用byte[]來映射相應的blob
          ??? ClobStringTypeHandler 用于處理clob類型數據,使用字符串來映射Clob
          ??? 有一點需要注意的是,AbstractLobTypeHandler中實現了事務支持,需要用來釋放相應的資源,所以一定需要在事務環境中進行。

          下面是一個簡單的例子:

          public class Food {
          ??? private String content;

          ??? private String id;

          ??? private byte[] image;

          ??? private String name;?? ?
          ??????? ...
          }

          xml如下:說明一下,在resultMap中可以通過typeHandler來指定具體的handler.在inline變量中,可以通過handler來定義相應的typeHandler

          <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>


          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 配置:
          。。。
          ????????? <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>

          簡單的測試:
          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());
          posted on 2007-01-13 21:53 布衣郎 閱讀(9416) 評論(1)  編輯  收藏 所屬分類: orm

          FeedBack:
          # re: ibatis如何支持clob 和blob
          2007-11-12 16:03 | zhou
          樓主我安你的方法做了提示報錯呀
          Translating SQLException with SQL state '42000', error code '1064', message 我用的是mysql5.0  回復  更多評論
            

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


          網站導航:
           

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 358033
          • 排名 - 156

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林芝县| 弥勒县| 陇川县| 高淳县| 栖霞市| 河津市| 阳信县| 台东县| 霍林郭勒市| 偏关县| 五寨县| 武川县| 浙江省| 肇源县| 云霄县| 辉南县| 虹口区| 收藏| 阿克苏市| 鹤山市| 稷山县| 岑巩县| 中江县| 阜阳市| 太保市| 南丰县| 离岛区| 沅陵县| 探索| 扶沟县| 且末县| 延吉市| 贡嘎县| 苍南县| 东阿县| 桂平市| 绵竹市| 佛冈县| 普宁市| 凉山| 沙雅县|