mengsun 2011-04-18
Ibatis是一个高效,方便,易于学习的数据访问组件,在性能上比hibernate高,学习难度也比hibernate和jdo要低,而且它比直接使用jdbc方便和易于维护。所以Ibatis深入大家的喜爱,一些对性能有更高的要求的系统(如保险,金融行业系统),或改造遗留系统时,Ibatis是数据访问组件的首选。
在使用Oracle数据库时,读取CLOB和BLOB等大类型的数据一直是个比较犯难的事,一般都是通过JDBC代码来实现对CLOB和BLOB数据的读写,效果和性能都是最好的,但是代码也相当复杂,且代码难以重用。
公司的项目正好有这方面的需要,要求我给予解决。在网上找了一些方法,好多不能满足需求,而且都是转载,于是看了下ibatis包,发现ibatis里面已经封装了类,只要直接使用即可。有两种方式实现:
1.通过配置ParameterMap和ResultMap来实现对LOB类型的读写
1.1 java代码
假设java类中有个字符串属性
private String detail; // 详细描述
1.2 sqlmap配置
<parameterMap class="Description" id="DescriptionParam">
<parameterproperty="detail"javaType="java.lang.String"jdbcType="NCLOB"typeHandler="com.ibatis.sqlmap.engine.type.ClobTypeHandlerCallback"/>
<parameterproperty="id"javaType="java.lang.Long"/>
</parameterMap>注意:因为使用了ParameterMap作为输入参数,在插入语句中用?号来代替属性值(如:#detail#) 新增数据时配置
<insert id="addDescription" parameterclass="Description" >
<![CDATA[
insertintodescription
(id,
detail)
values(#?#,#?#)
]]>
<selectKeyresultclass="java.lang.Long"keyProperty="id"type="pre">
selectSEQ_description_ID.NEXTVALfromDUAL
</selectKey>
</insert>更新数据时配置
<update id="updateDescription" parameterclass="Description" > update description set tab_detail = #?# where id=#?#
</update>
2. 通过parameterClass传入参数(推荐)
2.1 java代码
假设java类中有个字符串属性
private String detail; // 详细描述
2.2 sqlmap配置
新增数据时配置
<insert id="addDescription" parameterclass="Description" >
<![CDATA[
insertintodescription(id,detail)
values(#id#,#tabDetail,handler=com.ibatis.sqlmap.engine.type.ClobTypeHandlerCallback#)
]]>
<selectKeyresultclass="java.lang.Long"keyProperty="id"type="pre">
selectSEQ_description_ID.NEXTVALfromDUAL
</selectKey>
</insert>更新数据时配置
<update id="updateDescription" parameterclass="Description" >
updatedescription
<dynamicprepend="set">
<isNotNullprepend=","property="detail">
tab_detail=#detail,handler=com.ibatis.sqlmap.engine.type.ClobTypeHandlerCallback#
</isNotNull>
</dynamic>
where id=#id#</update>
ibatis还存在很多的typeHandler,大家自己可以看看
如:对于sql语句order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"。