国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

MyBatis使用動(dòng)態(tài)SQL標(biāo)簽的小陷阱

2019-11-26 13:43:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索封裝。MyBatis可以使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。

現(xiàn)在MyBatis越來(lái)越受大家的喜愛了,它的優(yōu)勢(shì)大家都知道,我就不多說(shuō)了,直接說(shuō)重點(diǎn)。

  MyBatis中提供動(dòng)態(tài)SQL功能,我們可以使用<if><when><where><otherwise><foreach>等等,這樣我們就可以寫出根據(jù)條件生成的動(dòng)態(tài)SQL了,但是,在這中間,我們經(jīng)常用到的<if>標(biāo)簽有一個(gè)小誤區(qū),一不小心就會(huì)掉下去,下面先舉個(gè)正常的例子:

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE' <if test="title != null">AND title like #{title}</if></select>

  在上面的例子中,當(dāng)title不等于null時(shí),<if>標(biāo)簽中間的條件才會(huì)被拼接上,這樣,SQL語(yǔ)句就是動(dòng)態(tài)的了。

  但是,當(dāng)我們對(duì)所有條件進(jìn)行判斷時(shí),你是否會(huì)這樣寫:

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">SELECT * FROM BLOG WHERE<if test="userId != null">state = ‘ACTIVE' </if><if test="title != null">AND title like #{title}</if></select>

  沒問題吧?至少語(yǔ)法上不錯(cuò)的,至少它可以正常生成一個(gè)SQL。

  但是,不知道你注意到了沒,當(dāng)所有條件都為null的時(shí)候,會(huì)出現(xiàn)什么情況?

SELECT * FROM BLOG WHERE

  看到了吧?這樣的SQL能成功執(zhí)行么?

  答案當(dāng)然是NO。

  那么該怎么辦?那就要記住了,當(dāng)你寫動(dòng)態(tài)SQL時(shí)候,先考慮一下會(huì)不會(huì)產(chǎn)生所有條件都不成立的情況,會(huì)不會(huì)出現(xiàn)只有一個(gè)WHERE而沒有條件的情況,那么你要做的就是加一個(gè)<where>標(biāo)簽將所有條件包起來(lái)。

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">SELECT * FROM BLOG <where><if test="userId != null">state = ‘ACTIVE' </if><if test="title != null">AND title like #{title}</if></where></select>

  這樣,當(dāng)所有條件都不成立時(shí),WHERE也不會(huì)被拼上。

  這時(shí),有機(jī)靈的小伙伴發(fā)現(xiàn)了,如果第一個(gè)條件不成立,第二個(gè)成立,那SQL會(huì)不會(huì)變成這樣?

SELECT * FROM BLOG WHEREAND title like #{title}

  這個(gè)就放心好了,當(dāng)你用<if>標(biāo)簽包圍條件后,它會(huì)自動(dòng)去掉AND的。

以上所述是小編給大家介紹的MyBatis使用動(dòng)態(tài)SQL標(biāo)簽的小陷阱,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大悟县| 梁河县| 新晃| 锦屏县| 高台县| 辽中县| 砀山县| 桃江县| 会昌县| 大悟县| 嘉黎县| 乳源| 沿河| 柳江县| 南召县| 共和县| 奉新县| 广州市| 云林县| 万源市| 什邡市| 昭通市| 博湖县| 黄龙县| 田东县| 邓州市| 太谷县| 昆明市| 乐清市| 开原市| 庆元县| 武乡县| 鹤壁市| 巴林右旗| 灵石县| 哈尔滨市| 普定县| 泸水县| 广灵县| 工布江达县| 中阳县|