<?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>
在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语句写在<![ ]]>里面。如
5、自动生成的主键
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:
6、存储过程
SQL Map通过<procedure>元素支持存储过程。下面的例子说明如何使用具有输出参数的存储过程。
支持标准的JDBC格式调用存储过程方法。如果存储过程回的是游标那又怎么定义的。
parameterClass
parameterClass属性的值是Java类的全限定名(即包括类的包名)。parameterClass属性是可选的,但强烈建议使用。它的目的是限制输入参数的类型为指定的Java类,并优化框架的性能。如果您使用parameterMap,则没有必要使用parameterClass属性。例如,如果要只允许Java类“examples.domain.Product”作为输入参数,可以这样作:
parameterMap
属性parameterMap的值等于一个预先定义的<parameterMap>元素的名称。parameterMap属性很少使用,更多的是使用上面的parameterClass和inline parameter(接下来会讨论)。 注意!动态mapped statement只支持inline parameter,不支持parameter map。 parameterMap的基本思想是定义一系列有次序的参数系列,用于匹配JDBC PreparedStatement的值符号。例如:
如上所述,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并不自动地绑定到特定的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”。