ibatis blob字段处理

   发现2.2后,ibatis的改变还是挺大的。对于自定义类型支持的也不错,这样对于blob和clob数据的处理也就简单多了。
    不过在spring 中已经提供了很好的实现,所以这又省去了很多的功夫,接下来看看ibatis是如何支持clob和blob的。
不过在spring 中已经提供了很好的实现,所以这又省去了很多的功夫,接下来看看ibatis是如何支持clob和blob的。

    ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler
    在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。
    BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob
    ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob
    有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。

下面是一个简单的例子:

java 代码
public class Food {  
    private String content;  
  
    private String id;  
  
    private byte[] image;  
  
    private String name;      
         ...  
}  


xml如下:说明一下,在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中,可以通过handler来定义相应的typeHandler
xml 代码
<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>  


java 代码
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 配置:
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>  


简单的测试:
java 代码
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());  

你可能感兴趣的:(spring,C++,c,ibatis,C#)