coolyongzi 发表于 2013-2-5 01:20:20

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中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。

下面是一个简单的例子:

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());
页: [1]
查看完整版本: ibatis如何支持clob 和blob