1 MyBatis動態(tài)SQL之綜述和 if 語句
摘要:使用 MyBatis 動態(tài)SQL,通過 if, choose, when, otherwise, trim, where, set, foreach和bind等標(biāo)簽,可組合成非常靈活的SQL語句,從而既提高 SQL 語句的準(zhǔn)確性,也大大提高攻城獅的開關(guān)效率。
1 MyBatis動態(tài)SQL之if 語句
2 MyBatis動態(tài)sql之where標(biāo)簽|轉(zhuǎn)
3 MyBatis動態(tài)SQL之set標(biāo)簽|轉(zhuǎn)
4 MyBatis動態(tài)SQL之trim元素|轉(zhuǎn)
5 MyBatis動態(tài)sql中foreach標(biāo)簽的使用
6 MyBatis動態(tài)SQL之choose(when、otherwise)語句
7 MyBatis動態(tài)SQL之bind標(biāo)簽|轉(zhuǎn)
綜述
??動態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過 JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態(tài) SQL,可以徹底擺脫這種痛苦。
??使用動態(tài) SQL 并非一件易事,但MyBatis 3 基于功能強(qiáng)大的 OGNL 表達(dá)式借助可用于任何 SQL 映射語句中的、強(qiáng)大的動態(tài) SQL 語言,顯著地提升了這一特性的易用性。
OGNL,全稱為Object-Graph Navigation Language,它是一個功能強(qiáng)大的表達(dá)式語言,用來獲取和設(shè)置Java對象的屬性,它旨在提供一個更高的更抽象的層次來對Java對象圖進(jìn)行導(dǎo)航。
??如果你之前用過 JSTL 或任何基于類 XML 語言的文本處理器,你對動態(tài) SQL 元素可能會感覺似曾相識。MyBatis 3 常用的動態(tài)SQL元素包括:
- if
- where
- set
- trim
- foreach
- choose (when、otherwise)
??下面我們就用一個簡單示例來看看在MyBatis中怎么使用動態(tài)SQL。
定義表結(jié)果和實(shí)體類
??首先,在數(shù)據(jù)庫創(chuàng)建一個表tb_employee,并插入測試數(shù)據(jù)。SQL腳本如下:
CREATE TABLE tb_employee(
ID INT(11) PRIMARY KEY AUTO_INCREMENT,
loginname VARCHAR(18),
PASSWORD VARCHAR(18),
NAME VARCHAR(18) DEEAULT NULL,
SEX CHAR(2) DEEAULT NULL,
AGE INT(11) DEFAULT NULL,
phone VARCHAR(21),
sal DOUBLE,
state VARCHAR(18)
);
INSERT INTO tb_employee(loginname,PASSWORD,NAMB,sex,age,phone,sal,state
VALUES('jack','123456','樓蘭胡楊",'男',26,'13900000001',9800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAMB,sex,age,phone,sal,state)
VALUES('rose','123456','Wiener','女',21,'13900000002',6800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAME,sex,age,phone,sal,state)
VALUES('tom','123456','湯姆','男',25,'13900000003,8800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAME sex,age,phone,sal,state)
VALUES('alice','123456','愛麗絲','女’,20,'13900000004,5800,ACTIVE');
??在數(shù)據(jù)庫中執(zhí)行SQL 腳本,完成創(chuàng)建tb_employee的操作。用實(shí)體類Employee映射tb_employee表。tb_employee 和 mployee將貫穿動態(tài)SQL所有章節(jié)。
if語句
??動態(tài)SQL通常會做的事情是有條件地包含where子句的一部分。比如:
<select id="selectEmployeeById" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee WHERE state = 'ACTIVE'
<!-- 可選條件,如果傳進(jìn)來的參數(shù)有id屬性,則加上id查詢條件-->
<if test="id != null">
and id = #{id}
</if>
</select>
??假設(shè)在上述SQL中查詢條件id的值不為null,那么控制臺打印出來的SQL為:
SBLECT * EROM tb_employee WHERE state = 'ACTIVE' and id = ?
??以上語句提供了一個可選的、根據(jù)id查找Employee的功能。如果沒有傳入id,那么所有處于“ACTIVE”狀態(tài)的Employee都會被返回; 反之若傳入了id,那么就會把查找id內(nèi)容的Employee結(jié)果返回。如果想通過兩個條件搜索該怎么辦呢? 很簡單,只要多加入一個條件即可,例如:
<select id="selectEmployeeByIdLike" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee WHERE state = 'ACTIVE'
<!-- 可選條件,如果傳進(jìn)來的參數(shù)有id屬性,則加上id查詢條件-->
<if test="id != null">
and id = #{id}
</if>
<!-- 兩個可選條件,例如登錄功能的登錄名和密碼查詢-->
<if test="loginname != null and password != null">
and loginname = #{loginname} and password = #{password)
</if>
</select>
可以使用兩個等于號==判斷id等于null的場景,if語句示例如下:
<if test="id == null">
??如果不使用if語句,則其SQL腳本如下:
<select id="selectByName" resultType="cn.mybatis.domain.Employee">
<!-- 這和普通的sql 查詢語句十分相似 -->
select * from tb_employee WHERE state = 'ACTIVE'and id = #{id} and loginname=#{loginname} and password=#{password}
</select>
??我們從上面的查詢語句可以發(fā)現(xiàn),如果 #{loginname} 為空,那么查詢結(jié)果也是空,使用起來缺乏靈活性,而動態(tài)SQL完全不畏懼這個。這就是動態(tài)SQL的長處之所在。
Reference
Buy me a coffee. ?Get red packets.
浙公網(wǎng)安備 33010602011771號