iBatis第四章:動態SQL的用法

1、什麼是動態SQL,以及使用動態SQL的好處
所謂動態SQL,是針對靜態SQL而言的,靜態SQL的SQL語句是固定的,使用動態SQL是爲了加強SQL的靈活性和複用性,能夠用一個動態SQL達到在不一樣條件下執行不一樣的SQL語句的效果,若是不用動態SQL,咱們可能須要使用幾個不一樣的SQL語句才能達到目的,可是使用動態SQL,只須要一個SQL就能夠實現。
例以下面是一個動態SQL的例子:
select * from t_user
<dynamic prepend="where">
<isNull property="id">
id is null
</isNull>
<isNotNull>
id = #id#
</isNotNull>
</dynamic>
上面的SQL語句會根據調用這個SQL語句的入參來組裝成不一樣的SQL語句,當id爲null時,其語句以下:
select * from t_user where id is null
當id不爲null時,其SQL語句以下:
select * from t_user where id = #id#
因而可知,咱們經過一個動態SQL就達到了兩個靜態SQL的目的,分別處理了兩種不一樣的狀況,這就是動態SQL的好處。sql

注意:在數據庫中,查詢值爲null的狀況不能用=來處理,例如select * from t_user where id is null和select * from t_user where id = ''是不一樣的!數據庫

2、如何使用動態SQL
iBatis 爲咱們處理動態SQL提供了一組相應的標籤,咱們只須要使用者一套動態標籤就能夠享受動態SQL帶給咱們的便利之處了。下面分別討論 iBatis 的動態標籤,它分爲5大類:
一、<dynamic>標籤
二、二元標籤
三、一元標籤
四、參數標籤
五、<iterate>標籤
在討論這些動態標籤以前,咱們先說明一下,有一些標籤的屬性是共享的,例如 prepend、open、close等這幾個屬性。其中prepend表示添加前綴、open和close分別表示開始和結尾,後面例子詳細說明。數組

-----------------一、<dynamic>標籤
<dynamic>是動態標籤的最頂層標籤,也就是說它不能嵌套,它用來劃分一個動態SQL片斷。
其屬性以下:
prepend:前綴
open:以XX開始
close:以XX結束學習

示例:
<select id="select_stulist" parameterClass="com.test.bean.Student" resultClass="com.test.bean.Student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isNotNull property="sex">
sex = #sex#
</isNotNull>
</dynamic>
</select>測試

/**
* 測試動態標籤 <dynamic>
*/
private void testDynamic(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
student.setSex("女");
List<Student> stuList = sqlMapClient.queryForList("select_stulist", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}spa

動態標籤的好處就是能夠根據咱們的參數不一樣實現不一樣的 sql查詢功能。get

-----------------二、二元標籤
二元標籤的做用就是將咱們的參數同另一個值或者參數進行比較,若是結果爲true,則包含二元標籤內的內容,不然就不包含。
經常使用的二元標籤以下:
<isEqual> 用於比較值是否相同
<isNotEqual> 用於比較值是否不一樣
<isGreaterThan> 比較值是否大於
<isGreaterEqual> 比較值是否大於等於
<isLessThan> 比較值是否小於
<isLessEqual> 比較值是否小於等於it

二元標籤的經常使用屬性:
property:指定須要比較的屬性
compareProperty:指定須要與property比較的屬性
compareValue:指定一個靜態值,用於同property的屬性值比較【注意compareProperty和compareValue必須指定其中一個】io

prepend:前綴做用
open:以XX開始
close:以XX結束test

示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 測試 二元 標籤 :若是入參性別爲男 則查詢編號大於給定值的學生信息-->
<select id="select_stulist1" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isEqual property="sex" compareValue="男">
id > #id#
</isEqual>
</dynamic>
</select>


private void testBinaryTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
student.setId(2);
student.setSex("男");

List<Student> stuList = sqlMapClient.queryForList("select_stulist1", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二元標籤能夠用咱們的入參與給定值進行比較。知足根據是否知足必定條件來生成不一樣的SQL。

-----------------三、一元標籤
一元標籤用於參考入參的某個屬性是否知足必定條件,若是知足,則包含標籤內的內容,不然忽略標籤體得內容。
經常使用一元標籤:
<isNull> 肯定所指定的字段是否爲null
<isNotNull> 肯定所指定的字段是否不爲null
<isEmpty> 肯定所指定的字段是否爲null、或者" "、以及是否爲空的集合
<isNotEmpty> 肯定所指定的字段是否不爲null、或者不爲" "、以及是否不爲空的集合
<isPropertyAvailable> 是否存在所指定的字段,對於Bean它尋找屬性,對於集合它尋找鍵值
<isNotPropertyAvailable> 與上面相反

一元標籤經常使用屬性:
property:指定須要比較的屬性
prepend:前綴做用
open:以XX開始
close:以XX結束

示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>

<!-- 測試 一元 標籤 -->
<select id="select_stulist2" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isNotNull property="sex">
sex = #sex#
</isNotNull>
</dynamic>
</select>

private void testUnaryTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {

//若是性別不爲null,則查詢指定性別的數據
student.setSex("女");

List<Student> stuList = sqlMapClient.queryForList("select_stulist2", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

-----------------四、參數標籤
參數標籤用於檢查某個參數是否傳遞進來了,主要有下面兩個標籤:
<isParameterPresent>和<isNotParameterPresent> ,這個不經常使用,瞭解便可。之後用到在作詳細學習。

-----------------五、<iterate>標籤
<iterate>容許一個集合或者數組做爲一個屬性傳遞到映射語句,咱們經過遍歷這個集合或者數組,獲得一個具體的SQL。它僅有<iterate>這個個標籤,主要有以下幾個屬性:
property:指定須要比較的屬性
prepend:前綴做用
open:以XX開始
close:以XX結束
<conjunction>: 用於鏈接集合或者數組產生的SQL的字符或者符號。

示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 測試 iterate標籤 -->
<select id="select_stulist3" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where name in">
<iterate property="names" open="(" close=")" conjunction=",">
#names[]#
</iterate>
</dynamic>
</select>

private void testIterateTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {

List<String> names = new ArrayList<String>();
names.add("修改後的姓名");
names.add("新增學生測試");

student.setNames(names);

List<Student> stuList = sqlMapClient.queryForList("select_stulist3", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

相關文章
相關標籤/搜索