现在的位置: 首页 > 综合 > 正文

ibatie 的语法 汇总(大家如果知道其他的请在评论里补充,谢谢)

2014年01月23日 ⁄ 综合 ⁄ 共 10010字 ⁄ 字号 评论关闭

1、基本语法

<?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="User">
    	<typeAlias alias="page" type="byd.core.Page"/>
    	<typeAlias alias="user" type="byd.entity.User"/>
    	<parameterMap id="userMap" class="user">
    		<parameter property="userName" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="passWord" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="emplNo" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="emplName" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="phoneNum" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="email" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="deptName" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="dutyName" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="remark" javaType="string" jdbcType="VARCHAR"/>
    		<parameter property="companyName" javaType="string" jdbcType="VARCHAR"/>
    	</parameterMap>
    	<sql id="byUserIdCondition">
    		<![CDATA[
    			id = #id:INTEGER#
    		]]>
    	</sql>
    	<!-- 新增用户 -->
    	<insert id="save" parameterMap="userMap">
    		<![CDATA[
    			INSERT INTO PLAN_USER (id,userName,passWord,emplNo,emplName,phoneNum,email,deptName,dutyName,remark,companyName)
    			VALUES (PLAN_USER_LOG_S.nextval,?,?,?,?,?,?,?,?,?,?)
    		]]>
    		<selectKey resultClass="java.lang.Integer">
			<![CDATA[
				SELECT  PLAN_USER_LOG_S.currval
				AS id FROM dual
			]]>
		</selectKey>
		</insert>
		<!-- 删除用户 -->
		<delete id="deleteById" parameterClass="user">
			<![CDATA[
				delete PLAN_USER
			]]>
			<dynamic prepend="WHERE">
				<include refid="byUserIdCondition"/>
			</dynamic>
		</delete>
    	<!-- 修改用户 -->
    	<update id="update" parameterClass="user">
		<![CDATA[
			update PLAN_USER
		]]>
		<dynamic prepend="SET">
			<isNotNull property="userName" prepend=",">
				<![CDATA[
					userName = #userName#
				]]>
			</isNotNull>
			<isNotNull property="passWord" prepend=",">
				<![CDATA[
					passWord = #passWord#
				]]>
			</isNotNull>
			<isNotNull property="emplNo" prepend=",">
				<![CDATA[
					emplNo = #emplNo#
				]]>
			</isNotNull>
			<isNotNull property="emplName" prepend=",">
				<![CDATA[
					emplName = #emplName#
				]]> 
			</isNotNull>
			<isNotNull property="phoneNum" prepend=",">
				<![CDATA[
					phoneNum = #phoneNum#
				]]>
			</isNotNull>
			<isNotNull property="deptName" prepend=",">
				<![CDATA[
					deptName = #deptName#
				]]>
			</isNotNull>
			<isNotNull property="dutyName" prepend=",">
				<![CDATA[
					dutyName = #dutyName#
				]]>
			</isNotNull>
			<isNotNull property="remark" prepend=",">
				<![CDATA[
					remark = #remark#
				]]>
			</isNotNull>
			<isNotNull property="email" prepend=",">
				<![CDATA[
					email= #email#
				]]>
			</isNotNull>
			<isNotNull property="companyName" prepend=",">
				<![CDATA[
					companyName = #companyName#
				]]>
			</isNotNull>
		</dynamic>
		<dynamic prepend="WHERE">
			<include refid="byUserIdCondition" />
		</dynamic>
	</update>
	<!-- 分页查询 -->
	<select id="findByPage" parameterClass="page" resultClass="user">
		<![CDATA[
			SELECT id,userName,passWord,emplNo,emplName,phoneNum,email,deptName,dutyName,remark,companyName,state FROM (SELECT a.*,ROWNUM nm
			FROM (SELECT u.id, u.username, u.passWord, u.emplname, u.emplno, u.companyname,u.phoneNum,
                   u.deptname, u.dutyname,u.remark, u.email,l.state
                  FROM PLAN_user u LEFT JOIN TIME_logout l ON u.id =l.userid
				WHERE (
					('$objCondition$' is null or upper(u.userName) LIKE upper('%$objCondition$%'))
					OR('$objCondition$' is null or upper(u.phoneNum) LIKE upper('%$objCondition$%'))
					OR('$objCondition$' is null or upper(u.email) LIKE upper('%$objCondition$%'))
					OR('$objCondition$' is null or upper(u.companyName) LIKE upper('%$objCondition$%'))
					OR('$objCondition$' is null or upper(u.deptName) LIKE upper('%$objCondition$%'))
					OR('$objCondition$' is null or upper(u.dutyName) LIKE upper('%$objCondition$%')))
					ORDER BY id DESC) a
                    WHERE ($start$=0 OR ROWNUM <= DECODE ($start$, 1, $limit$, $start$ + $limit$ - 1)))
          WHERE ($start$=0 OR nm >= $start$)
		]]>
	</select>
	<select id="findByCount" parameterClass="page" resultClass="int">
		<![CDATA[
		SELECT COUNT(*) FROM PLAN_USER
		WHERE (
				('$objCondition$' is null or upper(userName) LIKE upper('%$objCondition$%'))
				OR('$objCondition$' is null or upper(phoneNum) LIKE upper('%$objCondition$%'))
				OR('$objCondition$' is null or upper(email) LIKE upper('%$objCondition$%'))
				OR('$objCondition$' is null or upper(companyName) LIKE upper('%$objCondition$%'))
				OR('$objCondition$' is null or upper(deptName) LIKE upper('%$objCondition$%'))
				OR('$objCondition$' is null or upper(dutyName) LIKE upper('%$objCondition$%')))
		]]>
	</select>
	<!-- 用户登录 -->
	<select id="login" parameterClass="user" resultClass="user">
		<![CDATA[
			SELECT * FROM PLAN_USER u
					WHERE userName = #userName# and passWord = #passWord# and u.id not in(SELECT userId FROM TIME_LOGOUT)
		]]>
	</select>
	<!-- 查询所有用户姓名 -->
	<select id="findUser" resultClass="user">
		<![CDATA[
			SELECT emplName FROM PLAN_USER  
		]]>
	</select>
  </sqlMap>

2、传入list 循环插入,比在java代码里节省时间,我测试10万条数据单线程用时2秒

<!-- 批量插入数据 -->
    <insert id="insertAll" parameterClass="java.util.List">
        insert into score_v1_day_2level_above (uid,vip_level)
        values
        <iterate conjunction=",">
        	(#list[].uid:INTEGER#,#list[].vipLevel:INTEGER#)
        </iterate>
    </insert>

3、动态语法

在ibatis中使用安全的拼接语句,动态查询
ibatis比JDBC的优势之一,安全高效
说明文字在注释中
<select id="selectAllProducts" parameterClass="Product" resultMap="ProductResult">
    select id,note from Product
       <dynamic prepend="WHERE">
       <!-- isNotNull判断参数是否存在,Integer类型 -->
            <isNotNull property="id">
                <!-- isGreaterThan判断参数是否大于compareValue,isGreaterEquals是大于等于 -->
                <isGreaterThan prepend=" and " property="id" compareValue="0">
                id = #id#
                </isGreaterThan>
            </isNotNull>
            <!-- isNotEmpty判断字串不为空,isEmpty可以判断字串为空 -->
            <isNotEmpty prepend=" and " property="note">
            <!-- 模糊查询不能用#,#在是用prepareStatement的?插入参数,$是文本替换 -->
            note like '%$note$%'
            </isNotEmpty>
        </dynamic>
</select>

用Map传参数

<select id="selectAllProducts" parameterClass="java.util.HashMap" resultMap="ProductResult">
    select id,note from Product
       <dynamic prepend="WHERE">
       <!-- isPropertyAvailable判断属性是否有效 -->
          <isPropertyAvailable property="id">
            <isNotNull property="id">
                <!-- isLessThan判断参数是否小于compareValue,isLessEquals是小于等于 -->
                <isLessThan prepend=" and " property="id" compareValue="10">
                id = #id#
                </isLessThan>
            </isNotNull>
          </isPropertyAvailable>
        </dynamic>
</select>
/*动态SQL的参数有
属性关键字
含义

<isEqual>
如果参数相等于值则查询条件有效。

<isNotEqual>
如果参数不等于值则查询条件有效。

<isGreaterThan>
如果参数大于值则查询条件有效。

<isGreaterEqual>
如果参数等于值则查询条件有效。

<isLessEqual>
如果参数小于值则查询条件有效。如下所示:
<isLessEqual prepend = ”AND” property = ”age” compareValue = ”18” >
ADOLESCENT = ‘TRUE’
</isLessEqual>

<isPropertyAvailable>
如果参数有使用则查询条件有效。

<isNotPropertyAvailable>
如果参数没有使用则查询条件有效。

<isNull>
如果参数为NULL则查询条件有效。

<isNotNull>
如果参数不为NULL则查询条件有效。

<isEmpty>
如果参数为空则查询条件有效。

<isNotEmpty>
如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或“”。如下所示:
<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>

<isParameterPresent>
如果参数类不为NULL则查询条件有效。

<isNotParameterPresent>
Checks to see if the parameter object is not present (null). Example Usage:
<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>

4、 SQL语句在mapped statement 中最重要的部份,可以使用符合数据库或JDBC的任意SQL语句,对于语句有特殊途同归符号的,可以把SQL语句写在<![ ]]>里面。如

< statement  id ="getPersonsByAge"  parameterClass =”int”  resultClass ="examples.domain.Person" > 
 
 <![CDATA[ 
   SELECT * FROM PERSON WHERE AGE > #value# 
 
 ]]> 
</ statement > 

5、自动生成的主键
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:

< insert  id ="insertProduct-ORACLE"  parameterClass ="com.domain.Product" >  
< selectKey  resultClass ="int"  keyProperty ="id"   >  
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL 
 </ selectKey > 
     insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) 
</ insert >  
<! — Microsoft SQL Server IDENTITY Column Example -- > 
< insert  id ="insertProduct-MS-SQL"  parameterClass ="com.domain.Product" >  
    insert into PRODUCT (PRD_DESCRIPTION) values (#description#) 
    < selectKey  resultClass ="int"  keyProperty ="id"   >  
       SELECT @@IDENTITY AS ID 
   </ selectKey >
  </ insert >

6、存储过程 
SQL Map通过<procedure>元素支持存储过程。下面的例子说明如何使用具有输出参数的存储过程。

< parameterMap  id ="swapParameters"  class ="map"   >  
   
 < parameter 
property ="email1"    jdbcType ="VARCHAR"  javaType ="java.lang.String"  mode ="INOUT" /> 
 
 < parameter 
property ="email2"    jdbcType ="VARCHAR"   javaType ="java.lang.String"   mode ="INOUT" />  
</ parameterMap >  
< procedure  id ="swapEmailAddresses"  parameterMap ="swapParameters"   > 
   {call swap_email_address (?, ?)} 
</ procedure >

支持标准的JDBC格式调用存储过程方法。如果存储过程回的是游标那又怎么定义的。
parameterClass

parameterClass属性的值是Java类的全限定名(即包括类的包名)。parameterClass属性是可选的,但强烈建议使用。它的目的是限制输入参数的类型为指定的Java类,并优化框架的性能。如果您使用parameterMap,则没有必要使用parameterClass属性。例如,如果要只允许Java类“examples.domain.Product”作为输入参数,可以这样作:

< statement  id =”statementName”  parameterClass =”  examples.domain.Product” >  insert into PRODUCT values (#id#, #description#, #price#)
 
 </ statement >

parameterMap

属性parameterMap的值等于一个预先定义的<parameterMap>元素的名称。parameterMap属性很少使用,更多的是使用上面的parameterClass和inline parameter(接下来会讨论)。 注意!动态mapped statement只支持inline parameter,不支持parameter map。 parameterMap的基本思想是定义一系列有次序的参数系列,用于匹配JDBC PreparedStatement的值符号。例如:

< parameterMap  id =”insert-product-param”  class =”com.domain.Product”>
  
 <parameter property =”id”/> 
  
 <parameter property =”description”/> 
</parameterMap >  
< statement  id =”insertProduct”  parameterMap =”insert-product-param”>  insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); 
</statement
 >


如上所述,parameterMap负责将Java Bean的属性映射成statement的参数。
虽然parameterMap的外部形式很少使用,理解它如何工作对于理解inline parameter还是很有帮助。本节以下部分将详细讨论inline parameter。 <parameterMap id=”parameterMapName” [class=”com.domain.Product”]> <parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”] [nullValue=”NUMERIC”] [null=”-9999999”]/>
<parameter …… /> 
<parameter …… /> 
</parameterMap> 
括号[]是可选的属性。parameterMap元素只要求属性id作为唯一标识。属性class是可选的但强烈推荐使用。和parameterClass类似,class属性可以框架检查输入参数的类型并优化性能。
一个<parameterMap>的例子

< parameterMap  id =”insert-product-param”  class =”com.domain.Product”>
 
 <parameter property =”id”  jdbcType =”NUMERIC”  javaType =”int”  nullValue =”-9999999”/> 
<parameter property =”description”  jdbcType =”VARCHAR”  nullValue =”NO_ENTRY”/> 
</parameterMap >  
< statement  id =”insertProduct”  parameterMap =”insert-product-param”> 
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); 
</statement
 >

注意!
parameterMap并不自动地绑定到特定的Java类。因此在上面的例子中,任何拥有“id”和“description”属性的Java Bean对象,都可以作为parameterMap的输入。如果需要将输入绑定到特定的Java类,可以使用mapped-statement的resultClass属性。
 注意!
Parameter Map的名称(name)局部的,只在定义它的SQL Map XML文件中有效。不过,加上SQL Map的名称(即在<sqlMap>根元素中的名称)作为前缀,您可以在另一个SQL Map XML文件中引用它。例如,要在另一个文件中引用以上的parameterMap,可以使用名称“Product.insert-product-param”。

抱歉!评论已关闭.