欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么在MyBatis中實(shí)現(xiàn)動(dòng)態(tài)sql

這篇文章給大家介紹怎么在MyBatis中實(shí)現(xiàn)動(dòng)態(tài)sql,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

目前成都創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、西藏網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

1. 動(dòng)態(tài)sql

動(dòng)態(tài)sql是mybatis中的一個(gè)核心,什么是動(dòng)態(tài)sql?

動(dòng)態(tài)sql即對(duì)sql語(yǔ)句進(jìn)行靈活操作,通過(guò)表達(dá)式進(jìn)行判斷,對(duì)sql進(jìn)行靈活拼接、組裝。

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

MyBatis中用于實(shí)現(xiàn)動(dòng)態(tài)SQL的元素主要有:

1、if和where

2、choose(when,otherwise)

3、trim

4、set

5、foreach

就拿上一篇博文中對(duì)用戶(hù)的綜合查詢(xún)一例來(lái)說(shuō):

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

假如這個(gè)user是null咋整?或者user.sex或者user.username為null呢?所以更嚴(yán)謹(jǐn)?shù)淖龇☉?yīng)該是在執(zhí)行這個(gè)語(yǔ)句之前要先進(jìn)行判斷才對(duì),確保都不為空,那么我再去查詢(xún)。這就涉及到了mybatis中的動(dòng)態(tài)sql了。

在mybatis中,動(dòng)態(tài)sql可以使用標(biāo)簽來(lái)表示,這很類(lèi)似于jstl表達(dá)式,我們可以將上面的sql語(yǔ)句改成動(dòng)態(tài)sql,如下:

<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User">
 select * from user <!-- where可以自動(dòng)去掉條件中的第一個(gè)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>

上面的代碼很好理解,主要就是加了一些判斷,條件不為空,才進(jìn)行查詢(xún)條件的拼接,讓mybatis動(dòng)態(tài)的去執(zhí)行。那么在測(cè)試代碼中,我們可以故意的將user.sex不賦初值,就可以看到查詢(xún)的結(jié)果是不一樣的。

2. sql片段

那么現(xiàn)在還有個(gè)問(wèn)題,如果好幾個(gè)statement都需要這樣做,而且動(dòng)態(tài)sql部分都一樣,這就會(huì)導(dǎo)致一些代碼的重復(fù),所以如果遇到這種情況,我們就應(yīng)該抽取,動(dòng)態(tài)sql也可以抽取,我們可以將動(dòng)態(tài)的這部分sql抽取成sql片段,然后在具體的statement中引用進(jìn)來(lái)即可。如下:

<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片段起個(gè)名字而已,內(nèi)部就是上面的where動(dòng)態(tài)部分,然后我們將上面原來(lái)的動(dòng)態(tài)部分改成對(duì)這個(gè)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

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

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

首先有一點(diǎn)很明確,既然要使用多個(gè)id進(jìn)行查詢(xún),那么多個(gè)id肯定要作為參數(shù)傳進(jìn)來(lái),所以存儲(chǔ)多個(gè)id的List需要放到UserQueryVo中作為一個(gè)屬性,這點(diǎn)很好理解,所以我們先在UserQueryVo中增加這個(gè)屬性:

//傳入多個(gè)id
private List<Integer> ids;

然后我們修改UserMapper.xml中的sql片段(還是寫(xiě)在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>

下面簡(jiǎn)單介紹一下這個(gè)foreach中相關(guān)屬性的作用:

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

我們測(cè)試一下,然后看下控制臺(tái)打印出來(lái)的sql就很容易理解了。測(cè)試程序:

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

看下控制臺(tái)打印出的sql:

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

注意一個(gè)細(xì)節(jié):在mybatis中,如果輸入的是Integer或者int類(lèi)型的0,上面那個(gè)if判斷標(biāo)簽返回的是false,也就是說(shuō),即使非空非'',也不會(huì)拼接標(biāo)簽體中的sql。

所以mybatis自動(dòng)的將多個(gè)id拼接到了sql中。那么另外一個(gè)sql的實(shí)現(xiàn)就不再贅述了,跟上面的一樣,唯一不同的就是sql片段部分,如下:

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

關(guān)于怎么在MyBatis中實(shí)現(xiàn)動(dòng)態(tài)sql就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)站題目:怎么在MyBatis中實(shí)現(xiàn)動(dòng)態(tài)sql
文章網(wǎng)址:http://aaarwkj.com/article10/jpoddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、域名注冊(cè)、虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)
视频播放一区二区三区毛片| 亚洲女同另类在线播放视频| 国产日韩精品一区二区在线 | 国产视频成人免费观看| 国产精品乱人偷免费视频| 日韩伦理高清在线观看| 午夜精品久久福利视频| 亚洲午夜精品理论在线不卡| 欧美日韩三级国产在线| 91精品国产高清一区二区性色| 午夜福利院在线观看免费| 日韩欧美一区二区三级| 看看永久成人免费视频| 欧美在线观看黄片视频| 久久精品亚洲欧美激情| 欧美两性色一区二区三区| 国产男女免费视频观看| 黄色亚洲大片免费在线观看| 三级av电影中文字幕| 亚洲日本成人av在线观看| 国产又粗又长又猛又爽视频| 亚洲另类综合日韩一区| 亚洲少妇插进去综合网| 国产老熟女高潮视频| 精品久久久久久久中文字幕| 国产精品国产成人免费看| 国产婷婷综合一区二区| 久久热在线视频精品视频| 国产又大又长又粗又硬又猛| 国产日韩欧美 一区二区三区| 国产熟女碰碰人人a久久| 日本一区二区三区日本| 色婷婷av一区二区三| 日韩人妻中文字幕专区| 情五月激情亚洲丁香佳色| 国产精品av国产精华液| 欧美三级黄片免费视频| 国产饥渴熟女在线三区| 国产精品粉嫩在线播放| 国产av日韩精品一区二区三区| 久久裸体国语精品国产91|