技术开发 频道

Spring 让 LOB 数据操作变得简单易行



六、在 iBatis 中操作 LOB 数据

iBatis 为处理不同类型的数据定义了一个统一的接口:com.ibatis.sqlmap.engine.type.TypeHandler。这个接口类似于 Hibernate 的 UserType。iBatis 本身拥有该接口的众多实现类,如 LongTypeHandler、DateTypeHandler 等,但没有为 LOB 类型提供对应的实现类。Spring 在 org.springframework.orm.ibatis.support 包中为我们提供了几个处理 LOB 类型的 TypeHandler 实现类:

  • BlobByteArrayTypeHandler:将 BLOB 数据映射为 byte[] 类型;
  • BlobSerializableTypeHandler:将 BLOB 数据映射为 Serializable 类型的对象;
  • ClobStringTypeHandler:将 CLOB 数据映射为 String 类型;

当结果集中包括 LOB 数据时,需要在结果集映射配置项中指定对应的 Handler 类,下面我们采用 Spring 所提供的实现类对 Post 结果集的映射进行配置。


清单 12 . 对 LOB 数据进行映射
<?xml version="1.0" encoding="UTF-8" ?>
            <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
            "http://ibatis.apache.org/dtd/sql-map-2.dtd">
            <sqlMap namespace="Post">
            <typeAlias alias="post" type="com.baobaotao.domain.Post"/>
            <resultMap id="result" class="post">
            <result property="postId" column="post_id"/>
            <result property="userId" column="user_id"/>
            <result property="postText" column="post_text" ① 读取 CLOB 类型数据
            typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>
            <result property="postAttach" column="post_attach" ② 读取 BLOB 类型数据
            typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>
            </resultMap>
            <select id="getPost" resultMap="result">
            SELECT post_id,user_id,post_text,post_attach,post_time
            FROM t_post  WHERE post_id =#postId#
            </select>
            <insert id="addPost">
            INSERT INTO t_post(user_id,post_text,post_attach,post_time)
            VALUES(#userId#,
            #postText,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#, ③
            #postAttach,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#, ④
            #postTime#)
            </insert>
            </sqlMap>
            

    当 iBatis 引擎从结果集中读取或更改 LOB 类型数据时,都需要指定处理器。我们在 ① 和 ② 处为读取 LOB 类型的数据指定处理器,相似的,在 ③ 和 ④ 处为插入 LOB 类型的数据也指定处理器。

此外,我们还必须为 SqlClientMap 提供一个 LobHandler:


清单 13. 将 LobHandler 注入到 SqlClientMap 中
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"
            lazy-init="true" />
            <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="lobHandler" ref="lobHandler" /> ①设置LobHandler
            <property name="configLocation"
            value="classpath:com/baobaotao/dao/ibatis/sql-map-config.xml" />
            </bean>
            

    处理 LOB 数据时,Spring 要求在事务环境下工作,所以还必须配置一个事务管理器。iBatis 的事务管理器和 Spring JDBC 事务管理器相同,此处不再赘述。

七、小结

    本文就 Spring 中如何操作 LOB 数据进行较为全面的讲解,您仅需简单地配置 LobHandler 就可以直接在程序中象一般数据一样操作 LOB 数据了。对于 ORM 框架来说,Spring 为它们分别提供了支持类,您仅要使用相应的支持类进行配置就可以了。因此您会发现在传统 JDBC 程序操作 LOB 头疼的问题将变得轻松了许多。

0
相关文章