欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年10月13日 17:06:41   作者:心路無(wú)途  
MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,MyBatis越來(lái)越受大家的喜愛(ài)了。下面給大家分享MyBatis使用動(dòng)態(tài)SQL標(biāo)簽的小陷阱,感興趣的朋友一起看看吧

 MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(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)越受大家的喜愛(ài)了,它的優(yōu)勢(shì)大家都知道,我就不多說(shuō)了,直接說(shuō)重點(diǎn)。

  MyBatis中提供動(dòng)態(tài)SQL功能,我們可以使用<if><when><where><otherwise><foreach>等等,這樣我們就可以寫(xiě)出根據(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ì)這樣寫(xiě):

<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>

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

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

SELECT * FROM BLOG 
WHERE

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

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

  那么該怎么辦?那就要記住了,當(dāng)你寫(xiě)動(dòng)態(tài)SQL時(shí)候,先考慮一下會(huì)不會(huì)產(chǎn)生所有條件都不成立的情況,會(huì)不會(huì)出現(xiàn)只有一個(gè)WHERE而沒(méi)有條件的情況,那么你要做的就是加一個(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 
WHERE
AND title like #{title}

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

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

相關(guān)文章

  • java screen的配置詳解及注意事項(xiàng)

    java screen的配置詳解及注意事項(xiàng)

    這篇文章主要介紹了java screen的配置詳解及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java數(shù)組(Array)最全匯總(中篇)

    Java數(shù)組(Array)最全匯總(中篇)

    這篇文章主要介紹了Java數(shù)組(Array)最全匯總(中篇),本文章內(nèi)容詳細(xì),通過(guò)案例可以更好的理解數(shù)組的相關(guān)知識(shí),本模塊分為了三部分,本次為中篇,需要的朋友可以參考下
    2023-01-01
  • spring task @Scheduled注解各參數(shù)的用法

    spring task @Scheduled注解各參數(shù)的用法

    這篇文章主要介紹了spring task @Scheduled注解各參數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 微信支付java版V3驗(yàn)證數(shù)據(jù)合法性(Deom)

    微信支付java版V3驗(yàn)證數(shù)據(jù)合法性(Deom)

    這篇文章主要介紹了微信支付java版V3驗(yàn)證數(shù)據(jù)合法性(Deom)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Struts2中Action三種接收參數(shù)形式與簡(jiǎn)單的表單驗(yàn)證功能

    Struts2中Action三種接收參數(shù)形式與簡(jiǎn)單的表單驗(yàn)證功能

    本文以登錄驗(yàn)證為例,進(jìn)行代碼展示,下面給大家詳細(xì)介紹Struts2中Action三種接收參數(shù)形式與簡(jiǎn)單的表單驗(yàn)證功能,需要的朋友參考下
    2017-03-03
  • 關(guān)于Java中重定向傳參與取值

    關(guān)于Java中重定向傳參與取值

    這篇文章主要介紹了Java中重定向傳參與取值問(wèn)題,重定向不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源,還可以重定向到同一個(gè)站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對(duì)URL重定向到其他站點(diǎn)的資源,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解

    Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解

    這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解,在使用Netty進(jìn)行TCP消息傳輸時(shí),為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導(dǎo)致的問(wèn)題,一般可以通過(guò)消息定長(zhǎng)、將回車(chē)換行符作為消息結(jié)束符,需要的朋友可以參考下
    2023-12-12
  • 實(shí)現(xiàn)java簡(jiǎn)單的線程池

    實(shí)現(xiàn)java簡(jiǎn)單的線程池

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲(chóng)使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java 如何在list中刪除我指定的對(duì)象

    java 如何在list中刪除我指定的對(duì)象

    這篇文章主要介紹了java 如何在list中刪除我指定的對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java編程用指定字符打印菱形實(shí)例

    Java編程用指定字符打印菱形實(shí)例

    本文主要介紹了用指定的字符打印菱形的方法實(shí)例,一個(gè)簡(jiǎn)單容日上手的小程序,喜歡的朋友可以拿來(lái)練習(xí)一下。
    2017-09-09

最新評(píng)論