ibatis中常见的sql写法和注意事项

全文概要

本文主要着手于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说明
  1. 在oracle中wm_concat()这个函数,返回的就是clob类型的数据,针对这个函数的用法,各位筒子可以自行百度;
  2. 可以使用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>
  3. 上面这种写法是解决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>
  • 说明
  1. 查询结果为List,但resultClass不要写List,应该写List集合中数据的类型,常见返回String,Map,DTO,因为ibatis的queryForList()方法会自动将结果放进List中去;
  2. 比较入参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>

猜你喜欢

转载自blog.csdn.net/tianmlin1/article/details/79446981
今日推荐