<?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语句写在<![ ]]>里面。如
<![CDATA[
SELECT * FROM PERSON WHERE AGE > #value#
]]>
</ statement >
5、自动生成的主键
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:
< 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>元素支持存储过程。下面的例子说明如何使用具有输出参数的存储过程。
< 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 >
parameterMap
属性parameterMap的值等于一个预先定义的<parameterMap>元素的名称。parameterMap属性很少使用,更多的是使用上面的parameterClass和inline parameter(接下来会讨论)。 注意!动态mapped statement只支持inline parameter,不支持parameter map。 parameterMap的基本思想是定义一系列有次序的参数系列,用于匹配JDBC PreparedStatement的值符号。例如:
<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>的例子
<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”。