亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

MyBatis中動態sql的實現方法示例

2024-07-14 08:42:48
字體:
來源:轉載
供稿:網友

1. 動態sql

動態sql是mybatis中的一個核心,什么是動態sql?

動態sql即對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。

MyBatis的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多么痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號。有些時候,SQL語句where條件中,需要一些安全判斷,例如按某一條件查詢時如果傳入的參數是空,此時查詢出的結果很可能是空的,也許我們需要參數為空時,是查出全部的信息。使用Oracle的序列、mySQL的函數生成Id。這時我們可以使用動態SQL。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。通常使用動態 SQL 不可能是獨立的一部分,MyBatis 當然使用一種強大的動態 SQL 語言來改進這種情形,這種語言可以被用在任意的 SQL 映射語句中。動態 SQL 元素和使用 JSTL 或其他類似基于 XML 的文本處理器相似。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。

MyBatis中用于實現動態SQL的元素主要有:

1、if和where

2、choose(when,otherwise)

3、trim

4、set

5、foreach

就拿上一篇博文中對用戶的綜合查詢一例來說:

select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%'

假如這個user是null咋整?或者user.sex或者user.username為null呢?所以更嚴謹的做法應該是在執行這個語句之前要先進行判斷才對,確保都不為空,那么我再去查詢。這就涉及到了mybatis中的動態sql了。

在mybatis中,動態sql可以使用標簽來表示,這很類似于jstl表達式,我們可以將上面的sql語句改成動態sql,如下:

<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User"> select * from user <!-- where可以自動去掉條件中的第一個and --> <where> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="user.username!=null and user.username!=''"> and user.username like '%${user.username}%' </if> </if> </where></select>

上面的代碼很好理解,主要就是加了一些判斷,條件不為空,才進行查詢條件的拼接,讓mybatis動態的去執行。那么在測試代碼中,我們可以故意的將user.sex不賦初值,就可以看到查詢的結果是不一樣的。

2. sql片段

那么現在還有個問題,如果好幾個statement都需要這樣做,而且動態sql部分都一樣,這就會導致一些代碼的重復,所以如果遇到這種情況,我們就應該抽取,動態sql也可以抽取,我們可以將動態的這部分sql抽取成sql片段,然后在具體的statement中引用進來即可。如下:

<sql id="query_user_where"> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="user.username!=null and user.username!=''"> and user.username like '%${user.username}%' </if> </if></sql>

id是給該sql片段起個名字而已,內部就是上面的where動態部分,然后我們將上面原來的動態部分改成對這個sql片段的引用,如下:

<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User"> select * from user <where> <!-- 引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前面加上namespace --> <include refid="query_user_where"></include> <!-- 還可以引用其他sql片段 --> </where></select>

3. foreach

還有個問題:如果我們要向sql傳遞數組或List該咋整呢?mybatis使用的是foreach解析。為了模擬這個場景,我們將上面的查詢改成多個id查詢,有兩種查詢方式:

SELECT * FROM USER WHERE id=1 OR id=12 OR id=17SELECT * FROM USER WHERE id IN(1,12,17)

首先有一點很明確,既然要使用多個id進行查詢,那么多個id肯定要作為參數傳進來,所以存儲多個id的List需要放到UserQueryVo中作為一個屬性,這點很好理解,所以我們先在UserQueryVo中增加這個屬性:

//傳入多個idprivate List<Integer> ids;

然后我們修改UserMapper.xml中的sql片段(還是寫在sql片段中),如下:

<sql id="query_user_where"> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="user.username!=null and user.username!=''"> and user.username like '%${user.username}%' </if> </if> <if test="ids!=null"> <!-- 使用右邊的sql拼接:AND (id=1 OR id=12 OR id=17) --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR"> id=#{user_id}   </foreach> </if></sql>

下面簡單介紹一下這個foreach中相關屬性的作用:

collection:指定輸入對象中的集合屬性,這里就是這個ids。 item:表示每個遍歷生成的對象,自己起個名兒,在foreach體中使用。 open:開始遍歷時拼接的sql串。 close:結束遍歷時拼接的sql串。 separator:遍歷的兩個對象中需要拼接的sql串。

我們測試一下,然后看下控制臺打印出來的sql就很容易理解了。測試程序:

@Testpublic void testFindUserList() throws Exception {  SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  //創建包裝對象,設置查詢條件 UserQueryVo userQueryVo = new UserQueryVo(); User user = new User(); //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中 user.setSex("男"); user.setUsername("倪升武");  //傳入多個id List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(12); ids.add(17); userQueryVo.setIds(ids);  userQueryVo.setUser(user);  //調用userMapper的方法 List<User> list = userMapper.findUserList(userQueryVo); System.out.println(list);}

看下控制臺打印出的sql:

select * from user WHERE user.sex = ? and user.username like '%倪升武%' AND ( id=? OR id=? OR id=? ) 

注意一個細節:在mybatis中,如果輸入的是Integer或者int類型的0,上面那個if判斷標簽返回的是false,也就是說,即使非空非'',也不會拼接標簽體中的sql。

所以mybatis自動的將多個id拼接到了sql中。那么另外一個sql的實現就不再贅述了,跟上面的一樣,唯一不同的就是sql片段部分,如下:

<!-- 使用右邊的sql拼接:AND id IN(1,12,17) --><foreach collection="ids" item="user_id" open="AND id IN(" close=")" separator=","> #{user_id}</foreach>

總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品视频播放| 亚洲人成电影网站色xx| 亚洲人成电影网站色…| 深夜福利国产精品| 久久精品一区中文字幕| 日韩在线观看av| 成人av.网址在线网站| 欧美精品videosex牲欧美| 成人性教育视频在线观看| 欧美亚洲日本黄色| 中文字幕一区二区精品| 久久久久久久999精品视频| 爱福利视频一区| 成人中文字幕在线观看| 亚洲高清av在线| 91国产高清在线| 久久精品中文字幕电影| 不用播放器成人网| 亚洲字幕一区二区| 亚洲欧美另类人妖| 亚洲香蕉av在线一区二区三区| 国产精品人成电影在线观看| 亚洲成在人线av| 成人xvideos免费视频| 欧美精品www在线观看| 亚洲美女性生活视频| 亚洲国产成人在线播放| 亚洲区在线播放| 精品无人国产偷自产在线| 一本色道久久88精品综合| 91久久久久久久久久久| 亚洲欧美另类在线观看| 日韩av大片在线| 日韩av手机在线观看| 国产精品日韩在线一区| 欧美性视频网站| 国产精品一区二区三区毛片淫片| 91在线观看免费高清完整版在线观看| 欧美日韩黄色大片| 欧美电影在线播放| 欧美在线一级va免费观看| 在线一区二区日韩| 日韩激情av在线免费观看| 97在线精品国自产拍中文| 欧美视频第一页| 亚洲男女性事视频| 欧美专区第一页| 人九九综合九九宗合| 韩国三级电影久久久久久| 亚洲成人三级在线| 国产精品亚洲精品| 色婷婷av一区二区三区久久| 性亚洲最疯狂xxxx高清| 久久在线免费观看视频| 91久久久国产精品| 国产欧美一区二区三区久久人妖| 欧美另类暴力丝袜| 久久免费国产精品1| 国产精品羞羞答答| 欧美黄色片视频| 欧美日韩福利视频| 日韩免费观看在线观看| 国产精品27p| 精品久久久精品| 国产一区二区在线免费| 久久免费观看视频| 国产日韩精品电影| 亚洲免费av电影| 亚洲一区二区中文字幕| 一本色道久久综合狠狠躁篇的优点| 国产成人精彩在线视频九色| 91在线直播亚洲| 久久久综合免费视频| 亚洲第一页在线| 亚洲欧美日韩久久久久久| 国内精品久久久| 色综合久综合久久综合久鬼88| 亚洲人成亚洲人成在线观看| 久久久视频免费观看| 国产精品亚洲片夜色在线| 欧美精品日韩www.p站| 精品在线观看国产| 68精品久久久久久欧美| 日韩hd视频在线观看| 欧美电影在线免费观看网站| 久热精品视频在线观看一区| 日韩精品在线观看一区二区| 欧美福利视频网站| 91视频国产一区| 欧美中文字幕视频在线观看| 国产盗摄xxxx视频xxx69| 欧美午夜xxx| 2019最新中文字幕| 欧美国产第一页| 欧美电影免费观看电视剧大全| 精品国产欧美一区二区五十路| 北条麻妃一区二区在线观看| 久久精品国产精品亚洲| 国产成人精品a视频一区www| 日韩在线免费观看视频| 成人性生交大片免费看小说| 懂色av中文一区二区三区天美| 欧美韩国理论所午夜片917电影| 精品国产拍在线观看| 精品国产乱码久久久久久虫虫漫画| 日韩最新av在线| 欧美巨乳在线观看| 国产精品中文字幕久久久| 欧美激情欧美狂野欧美精品| 国产91精品最新在线播放| 中文字幕免费精品一区高清| 日韩精品中文字| 国产一区视频在线| 国产精品久久久久久av福利| 91久久夜色精品国产网站| 亚洲国产精品视频在线观看| 国产视频丨精品|在线观看| 成人国产精品一区| 久久91精品国产| 亚洲黄色在线观看| 久久激情视频免费观看| 国产精品精品视频一区二区三区| 91精品国产九九九久久久亚洲| 91九色综合久久| 国产精品成人在线| 欧美性受xxxx白人性爽| 中文字幕亚洲激情| 久久综合88中文色鬼| 成人免费在线视频网站| 国产欧美中文字幕| 国产综合香蕉五月婷在线| 中文字幕免费国产精品| 日韩欧美精品网站| 久久免费观看视频| 欧美日本高清视频| 亚洲美女免费精品视频在线观看| 国产婷婷色综合av蜜臀av| 国产999在线观看| 国产精品入口日韩视频大尺度| 亚洲欧美制服中文字幕| 狠狠操狠狠色综合网| 久久精品99久久久香蕉| 国产精品久久久久9999| 欧美最近摘花xxxx摘花| 国产精品第2页| 欧美电影在线观看| 亚洲欧美在线一区| 91高清在线免费观看| 日韩视频免费看| 日韩精品中文字幕视频在线| 亚洲a在线观看| 日韩精品中文字幕视频在线| 久热精品在线视频| 久久91精品国产| 高清欧美性猛交xxxx黑人猛交| 亚洲电影中文字幕| 激情成人中文字幕| 国产mv免费观看入口亚洲| 成人精品一区二区三区| 精品国产一区二区三区久久| 亚洲一区中文字幕| 91av在线不卡| 国产91在线视频| 中文字幕v亚洲ⅴv天堂|