(1)實例一:
<!-- 動態條件分頁查詢 -->
<sql id="sql_count">
select count(*)
</sql>
<sql id="sql_select">
select *
</sql>
<sql id="sql_where">
from icp
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
name like '%$name$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="path">
path like '%path$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="area_id">
area_id = #area_id#
</isNotEmpty>
<isNotEmpty prepend="and" property="hided">
hided = #hided#
</isNotEmpty>
</dynamic>
<dynamic prepend="">
<isNotNull property="_start">
<isNotNull property="_size">
limit #_start#, #_size#
</isNotNull>
</isNotNull>
</dynamic>
</sql>
<select id="findByParamsForCount" parameterClass="map" resultClass="int">
<include refid="sql_count"/>
<include refid="sql_where"/>
</select>
<select id="findByParams" parameterClass="map" resultMap="icp.result_base">
<include refid="sql_select"/>
<include refid="sql_where"/>
</select>
<sql id="sql_count">
select count(*)
</sql>
<sql id="sql_select">
select *
</sql>
<sql id="sql_where">
from icp
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
name like '%$name$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="path">
path like '%path$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="area_id">
area_id = #area_id#
</isNotEmpty>
<isNotEmpty prepend="and" property="hided">
hided = #hided#
</isNotEmpty>
</dynamic>
<dynamic prepend="">
<isNotNull property="_start">
<isNotNull property="_size">
limit #_start#, #_size#
</isNotNull>
</isNotNull>
</dynamic>
</sql>
<select id="findByParamsForCount" parameterClass="map" resultClass="int">
<include refid="sql_count"/>
<include refid="sql_where"/>
</select>
<select id="findByParams" parameterClass="map" resultMap="icp.result_base">
<include refid="sql_select"/>
<include refid="sql_where"/>
</select>
說明:
0.
使用<sql id="">,<include refid="">作用:方便一些sql內容,在多個地方重復使用;且使主sql語句比較簡潔(缺點:但看上去不一目了然)
同時,可以隨便將sql語句中作任一部分抽取出來到sql,在主sql中間調用也沒問題。如下:
SELECT d.Device_ID,d.Device_Name,a.App_ID,a.App_Name,a.App_Memo
FROM T_Device_BaseInfo d ,T_App_Spce_R_Info da ,T_App_Info a
WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
FROM T_Device_BaseInfo d ,T_App_Spce_R_Info da ,T_App_Info a
WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
可以改為:
<sql id="selectDapermit">
d.Device_Name,a.App_ID,a.App_Name,a.App_Memo FROM T_Device_BaseInfo d ,
</sql>
d.Device_Name,a.App_ID,a.App_Name,a.App_Memo FROM T_Device_BaseInfo d ,
</sql>
SELECT d.Device_ID
,<include refid="selectDapermit" />
T_App_Spce_R_Info da ,T_App_Info a
WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
T_App_Spce_R_Info da ,T_App_Info a
WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
1.
<dynamic prepend="where"> ..</dynamic>標簽,即可此標簽中間部分任一個條件為true時,會向當前的sql語句中添加一個"where"的字符.
2.
若只有一個判斷條件時,可以直接用:
<isNotEmpty prepend="where" property="name">
name like '%$name$%'
</isNotEmpty>
name like '%$name$%'
</isNotEmpty>
3.
模糊查詢:
在通常情況下
ibatis的參數在sqlmap中使用#param#的形式,參數名以’#‘包着,但當使用模糊查詢時,須將#改為$.如上.
4.
設置范圍查詢時,須用雙重判斷,又如:
<isNotEmpty prepend="" property="_starttime">
<isNotEmpty prepend="and" property="_endtime">
<![CDATA[
createtime >= #_starttime#
and createtime < #_endtime#
]]>
</isNotEmpty>
</isNotEmpty>
<isNotEmpty prepend="and" property="_endtime">
<![CDATA[
createtime >= #_starttime#
and createtime < #_endtime#
]]>
</isNotEmpty>
</isNotEmpty>
(2)實例二
<insert id="insert" parameterClass="RuleMaster">
insert into rulemaster(
name,
createtime,
updatetime,
remark
) values (
#name#,
now(),
now(),
#remark#
)
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey>
</insert>
<!-- 更新 -->
<update id="update" parameterClass="RuleMaster">
update rulemaster set
name = #name#,
updatetime = now(),
remark = #remark#
where id = #id#
</update>
insert into rulemaster(
name,
createtime,
updatetime,
remark
) values (
#name#,
now(),
now(),
#remark#
)
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey>
</insert>
<!-- 更新 -->
<update id="update" parameterClass="RuleMaster">
update rulemaster set
name = #name#,
updatetime = now(),
remark = #remark#
where id = #id#
</update>
說明:
<selectKey>用於iBatis自動生成的主鍵
很多數據庫支持自動生成主鍵的數據類型。不過這通常(並不總是)是個私有的特性。
SQL Map 通過<insert>的子元素<selectKey>來支持自動生成的鍵值。它同時支持預生成(如
Oracle)和后生成兩種類型(如 MS-SQL Server)。下面是兩個例子:
< !—Oracle SEQUENCE Example -->
<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>
很多數據庫支持自動生成主鍵的數據類型。不過這通常(並不總是)是個私有的特性。
SQL Map 通過<insert>的子元素<selectKey>來支持自動生成的鍵值。它同時支持預生成(如
Oracle)和后生成兩種類型(如 MS-SQL Server)。下面是兩個例子:
< !—Oracle SEQUENCE Example -->
<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>
<!-- Mysql 這個例子是我自己加上去的-->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
insert into PRODUCT(PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into PRODUCT(PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
(3)
動態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)
iterator用法:
Person代碼大致如下:
public class Person{
public Person(int age){
this.age=age;
}
/**
* 年齡
*/
private int age;
/**
* 性別
*/
private String sex;
//get/set方法略
...
}//end of Person
public Person(int age){
this.age=age;
}
/**
* 年齡
*/
private int age;
/**
* 性別
*/
private String sex;
//get/set方法略
...
}//end of Person
PersonDaoImp如下:
/**
* 刪除性別為man,年齡為 11,12 的Person記錄
*/
public int deletePerson(Map<String, Object> map) {
List<Person> personList=new ArrayList<Person>();
Person p1=new Person(11);
person p2=new Person(12);
personList.add(p1);
personList.add(p2);
map.put("personList", personList);
map.put("sex",'man');
return getSqlMapClientTemplate().delete(
"person.deletePerson", map);
}
* 刪除性別為man,年齡為 11,12 的Person記錄
*/
public int deletePerson(Map<String, Object> map) {
List<Person> personList=new ArrayList<Person>();
Person p1=new Person(11);
person p2=new Person(12);
personList.add(p1);
personList.add(p2);
map.put("personList", personList);
map.put("sex",'man');
return getSqlMapClientTemplate().delete(
"person.deletePerson", map);
}
person.xml如下:
<!-- 刪除相應的person記錄 -->
<delete id="deletePerson" parameterClass="map">
delete from 表名 where sex=#sex#
<iterate prepend=" and" property=" personList" open="("
close=")" conjunction="or">
age=$ personList[]. age$
</iterate>
</delete>
<delete id="deletePerson" parameterClass="map">
delete from 表名 where sex=#sex#
<iterate prepend=" and" property=" personList" open="("
close=")" conjunction="or">
age=$ personList[]. age$
</iterate>
</delete>
輸出sql如下:
delete from 表名 where sex='man' and (age =11 or age=12 )
當然你也可以這么寫:
person.xml如下:
delete from 表名 where sex='man' and (age =11 or age=12 )
當然你也可以這么寫:
person.xml如下:
<!-- 刪除相應的person記錄 -->
<delete id="deletePerson" parameterClass="map">
delete from 表名 where sex=#sex# and age in
<iterate property=" personList" open="("
close=")" conjunction=",">
$ personList[]. age$
</iterate>
</delete>
<delete id="deletePerson" parameterClass="map">
delete from 表名 where sex=#sex# and age in
<iterate property=" personList" open="("
close=")" conjunction=",">
$ personList[]. age$
</iterate>
</delete>
輸出sql如下:
delete from 表名 where sex='man' and age in (11 ,12 )
delete from 表名 where sex='man' and age in (11 ,12 )
(5)
ibatis中,須添加:
<![CDATA[ ]]>:
可以用來分隔sql語句出來,以防止與xml中一些語法沖突。如sql中的<,>,<>等符號若直接寫在xml中,xml會報錯。
<![CDATA[ ]]>:
可以用來分隔sql語句出來,以防止與xml中一些語法沖突。如sql中的<,>,<>等符號若直接寫在xml中,xml會報錯。
若放入CDATA中,則正常。
但其中的內容,不包括<include refid> 或 <isNotNull>等標簽。
可以包括a.id=#personId#.
但其中的內容,不包括<include refid> 或 <isNotNull>等標簽。
可以包括a.id=#personId#.
如:
<sql id="oraderby">
order by a.name desc
</sql>
order by a.name desc
</sql>
<![CDATA[
select a.name ,b.name from a,b
where a.id<>b.id
and b.age=#age#
]]>
<isNotNull prepend="and" property="name">
a.name=#name#
</isNotNull>
<include refid="orderby">
select a.name ,b.name from a,b
where a.id<>b.id
and b.age=#age#
]]>
<isNotNull prepend="and" property="name">
a.name=#name#
</isNotNull>
<include refid="orderby">