全文概要
本文主要着手于Apache推出的一种轻量级对象关系映射(ORM)框架--ibatis,介绍一些常见的sql配置写法和注意事项,欢迎补充!本文主要内容如下:
- insert操作返回主键
- 处理clob大数据类型
- 调用procedure
- 调用function
- 传参为List
- 返回结果为List
insert操作返回主键
ibatis中有针对插入数据返回主键的配置,在实际开发中是很常见的,配置写法如下:
<insert id="savePolicyData" parameterClass="XXXDTO">
<selectKey resultClass="java.lang.String" keyProperty="OfferId">
SELECT RAWTOHEX(HEXTORAW(SYS_GUID())) AS OfferId FROM DUAL
</selectKey>
INSERT INTO xxx_TABLE
(
ID,
xxx,
xxx)
VALUES
(
#OfferId#,
#xxx_value#,
#xxx_value#
)
</insert>
- 在java代码中调用该sql的写法
return this.getSqlMapClientTemplate().insert("savePolicyData",XXXDTO);//返回Object类型,需强转
处理CLOB类型
在sql查询中,有时会遇到clob类型的数据,针对clob类型的处理,下面通过oracle来引入:
<!--Oracle数据库中wm_concat()返回就是一个clob数据类型-->
<select id="queryReqPara" resultMap="buildReqPara" parameterClass="java.lang.String">
select a.columA,a.columB,wm_concat(a.columC) as columC
from table_XXX a
where a.XXX=#xxx_value#
</select>
<!--自定义一个map,和javaDTO映射-->
<resultMap class="XXXDTO" id="buildReqPara">
<result colum="columA" property="xxxA" jdbcType="String"></result>
<result colum="columB" property="xxxB" jdbcType="String"></result>
<result colum="columC" property="xxxC" jdbcType="CLOB"></result>
</resultMap>
- sql说明
- 在oracle中wm_concat()这个函数,返回的就是clob类型的数据,针对这个函数的用法,各位筒子可以自行百度;
- 可以使用to_char()函数将clob类型转换成varchar类型,但是有一个问题是,若该函数返回值超过了varchar的最大长度时,就会出现异常;
<parameterMap class="java.util.Map" id="functionResultMap"> <parameter property="result" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"></parameter> <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"></parameter> <parameter property="deptNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"></parameter> </parameterMap> <procedure id="dealData" parameterMap="functionResultMap"> <![CDATA[{? = call XXX_function(?,?)}]]> </procedure>
- 上面这种写法是解决clob类型比较稳妥的方法,自定义map中colum是sql查询结果,property是对应DTO的成员变量,jdbcType是映射的类型。
- 在java代码中的调用写法
List<XXXDTO> this.getSqlMapClientTemplate().queryForList("queryReqPara",xxx_value);
调用存储过程/函数
在ibatis中调用procedure和function,配置如下:
- 调用procedure
<parameterMap class="java.util.Map" id="procedureResultMap">
<parameter property="RESULTCODE" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"></parameter>
<parameter property="RESULTMESSAGE" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"></parameter>
</parameterMap>
<procedure id="dealData" parameterMap="procedureResultMap">
{call XXX_procedure(?,?)}
</procedure>
- 在java中调用存储过程
Map<String,String> resultMap = new HashMap<String,Object>();
this.getSqlMapClientTemplate().queryForObject("dealData",resultMap);
String resultCode = resultMap.get("RESULTCODE");
String resultMessage = resultMap.get("RESULTMESSAGE");
- 调用function
<parameterMap class="java.util.Map" id="functionResultMap">
<parameter property="result" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"></parameter>
<parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"></parameter>
<parameter property="deptNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"></parameter>
</parameterMap>
<procedure id="dealData" parameterMap="functionResultMap">
<![CDATA[{? = call XXX_function(?,?)}]]>
</procedure>
- 在java代码中调用function
String result = this.getSqlMapClientTemplate().queryForObject("dealData",resultMap);
传参为List/返回结果为List
在ibatis中参数支持List和数组,本例中用List来介绍,如何处理list类型的参数:
- ibatis配置写法
<!--入参为List-->
<select id="getThirdDeptNo" parameterClass="java.util.List" resultClass="java.lang.String">
select r.parent_dept_no from xxx_table r
where r.xxx = '3'
and r.child_dept_no in
<iterate open="(" close=")" conjunction=",">
#deptNolist[]#
</iterate>
</select>
<!--入参为Map,多了property属性-->
<select id="getThirdDeptNo" parameterClass="java.util.Map" resultClass="java.lang.String">
select r.parent_dept_no from xxx_table r
where r.xxx = '3'
and r.child_dept_no in
<iterate property="deptNolist" open="(" close=")" conjunction=",">
#deptNolist[]#
</iterate>
</select>
- 说明
- 查询结果为List,但resultClass不要写List,应该写List集合中数据的类型,常见返回String,Map,DTO,因为ibatis的queryForList()方法会自动将结果放进List中去;
- 比较入参map和list,发现map中多了个property属性,list中是不需要这个属性的,原因就是ibatis底层会根据property去判断,若加了就会在参数中查询对应名称的参数对象,list是一个对象没有属性就会抛出异常。
Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean.
Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
- java代码写法
//参数为List<String>写法
List<String> resutList = this.getSqlMapClientTemplate().queryForList("getThirdDeptNo",deptNolist);//deptNolist为List
//参数为List<Map<String,String>>写法
List<String> resutList = this.getSqlMapClientTemplate().queryForList("getThirdDeptNo",deptNolist);//deptNolist为List<Map>