`

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

下面是一个简单的例子:


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());  
分享到:
评论

相关推荐

    判断blob字段是否为空

    本文将深入探讨如何判断一个BLOB字段是否为空,这是一个在数据库操作中极为实用且关键的技术点。 ### BLOB字段简介 BLOB类型用于存储大量的二进制数据。不同于传统的字符型数据,BLOB可以存储诸如图片、音频文件或...

    delphi读写BLOB字段

    delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...

    java对oracle数据库中blob字段的处理

    BLOB字段主要用于存储大量的二进制数据,如图像、音频、视频或任何其他非文本格式的数据。Java对Oracle数据库中BLOB字段的处理涉及多个层面,包括读取、写入、更新以及跨数据库操作等。 ### Java处理Oracle BLOB...

    oracle中对blob字段的处理方法

    oracle中对blob字段的处理方法,包括增加,删除,修改,更新等操作。

    C#访问oracle数据库类,带blob字段读写

    写入Blob字段时,先创建`OracleParameter`对象,将其Direction设置为` ParameterDirection.Input `,OracleDbType设置为`OracleDbType.Blob`,然后赋值。以下是一个示例: ```csharp // 读取Blob字段 using ...

    批量导出ORACLE数据库BLOB字段生成图片

    批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将数据库中的图片资源导出到本地文件系统的情况。下面将详细介绍这一过程及其相关知识点。 首先,我们需要理解BLOB类型。BLOB...

    oracle查询blob字段照片(jpeg) 像素大小sql

    本篇文章将详细介绍如何通过SQL查询语句获取存储在Blob字段中的JPEG格式照片的像素大小。 ### 1. 了解Blob数据类型 在Oracle数据库中,Blob(Binary Large Object)类型用于存储大容量的二进制数据,比如图像、音频...

    Oracle blob字段上传下载

    ### Oracle Blob字段上传与下载详解 #### 一、概述 在数据库系统中,二进制大对象(Binary Large Object,简称BLOB)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。Oracle数据库支持Blob...

    oracle中读取blob字段.doc

    ### Oracle中BLOB字段的读取与操作 #### 一、引言 在数据库系统中,BLOB(Binary Large Object)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。在Oracle数据库中,BLOB类型特别适用于处理...

    ORACLE中BLOB字段导入到SQL SERVER中的IMAGE字段

    1. **数据准备**:确保ORACLE数据库中的BLOB字段包含所需的数据,并且是完整的。可能需要进行数据验证,以确保所有数据都能被正确读取。 2. **数据导出**:使用ORACLE提供的工具,如SQL*Plus或者PL/SQL Developer,...

    oracle blob 字段 读写 delphi

    本篇文章将深入探讨如何在Delphi中对Oracle数据库的BLOB字段进行读写操作。 首先,你需要在Delphi项目中引入Oracle数据库访问的相关组件,如DBExpress或ADO。DBExpress是Delphi内置的一个轻量级数据库访问框架,而...

    批量导出ORACLE数据库BLOB字段生成文件

    本教程将详细讲解如何批量导出Oracle数据库中的BLOB字段并生成文件,适用于需要定期或一次性处理大量图片或其他BLOB数据的场景。 首先,确保你已经在本地安装了Oracle客户端。Oracle客户端提供了SQL*Plus和其他工具...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    java中读取ORACLE中BLOB字段存储的图片

    ### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...

    基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案.pdf

    "基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案" 本文介绍了一种基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案。该方案使用JSP技术读取ORACLE数据库中的BLOB字段存储的坐标点,然后将坐标传递到...

    Python如何操作Oracle的Blob字段

    Python如何操作Oracle的Blob字段,

    Delphi将图片以二进制方式存储在数据库BLOB字段中.rar

    在这个特定的案例中,"Delphi将图片以二进制方式存储在数据库BLOB字段中"是一个常见的实践,用于高效、安全地保存图片数据。BLOB(Binary Large Object)字段是数据库系统中用来存储大量二进制数据的类型,非常适合...

    spring+mybatis下BLOB字段的图片存取代码

    spring+mybatis下BLOB字段的图片存取代码,仅整理了Controller层的代码,service和dao的代码很简单,所以没有整理

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    本教程将深入探讨如何使用Java进行Blob字段的操作,以实现将图片或文件保存到数据库中。 1. **Blob字段的理解** Blob是SQL标准定义的一种数据类型,它能够存储大量的二进制数据,如图像、音频文件、PDF文档等。在...

    C++插入SQLite数据库的BLOB字段

    在本例中,我们假设已经有一个名为`images`的表,其中包含一个名为`image_data`的BLOB字段。使用`sqlite3_prepare_v2()`函数编译SQL语句,如下所示: ```cpp const char *sql = "INSERT INTO images (image_data) ...

Global site tag (gtag.js) - Google Analytics