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

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

          下面是一個簡單的例子:

          public class Food {
          ??? private String content;

          ??? private String id;

          ??? private byte[] image;

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

          xml如下:說明一下,在resultMap中可以通過typeHandler來指定具體的handler.在inline變量中,可以通過handler來定義相應(yīng)的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 布衣郎 閱讀(9402) 評論(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  回復(fù)  更多評論
            

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


          網(wǎng)站導(dǎo)航:
           

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

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357330
          • 排名 - 155

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 旬阳县| 荥阳市| 塘沽区| 万山特区| 利津县| 普定县| 正蓝旗| 武乡县| 五峰| 前郭尔| 仁怀市| 定安县| 黄山市| 汉沽区| 汉川市| 冀州市| 赤水市| 赤峰市| 简阳市| 安新县| 乐安县| 洛川县| 寿阳县| 鹤壁市| 井研县| 武川县| 大洼县| 湖口县| 宁陵县| 炉霍县| 马关县| 米脂县| 鹤庆县| 高台县| 丹凤县| 乐至县| 汤阴县| 建德市| 射阳县| 合作市| 博白县|