6. MyBatis中的動態(tài)sql語句

Mybatis 的映射文件中蜘腌,有些時候業(yè)務(wù)邏輯復(fù)雜時辰如,我們的 SQL 是動態(tài)變化的,此時使用前面的方式我們的 SQL 就不能滿足要求了责循。

建立工程:


image.png
image.png
image.png

1糟港、動態(tài) SQL 之<if>

根據(jù)實體類的不同取值,使用不同的 SQL 語句來進(jìn)行查詢院仿。比如在姓名如果不為空時可以根據(jù) 姓名查詢秸抚,如果性別不同空時還要加入用戶名作為條件。這種情況在我們的多條件組合查詢中經(jīng)常會碰到歹垫。

持久層 Dao 接口
UserDao.java

    /**
     * 根據(jù)傳入?yún)?shù)條件
     * @param user 查詢的條件:有可能有用戶名剥汤,有可能有性別,也有可能有地址县钥,還有可能是都有
     * @return
     */
    List<User> findUserByCondition(User user);

持久層 Dao 映射配置
UserDao.xml

    <!--根據(jù)條件查詢-->
    <select id="findUserByCondition" resultMap="userMap" parameterType="user">
        select * from user where 1=1
        <if test="userName != null">
          and username = #{userName}
        </if>
        <if test="userSex != null">
            and sex = #{userSex}
        </if>
    </select>

MybatisTest.java

    /**
     * 測試查詢所有
     */
    @Test
    public void testFindByCondition(){
        User u = new User();
        //u.setUserName("王五");
        u.setUserSex("女");

        //執(zhí)行查詢所有方法
        List<User> users = userDao.findUserByCondition(u);
        for(User user : users){
            System.out.println(user);
        }

單個姓名查


image.png

單個性別查


image.png

姓名和性別一起查


image.png

注意:<if>標(biāo)簽的 test 屬性中寫的是對象的屬性名秀姐,如果是包裝類的對象要使用 OGNL 表達(dá)式的寫法。
另外要注意 where 1=1 的作用~若贮!


2省有、動態(tài) SQL 之<where>

為了簡化上面 where 1=1 的條件拼裝,我們可以采用<where>標(biāo)簽來簡化開發(fā)谴麦。
持久層 Dao 映射配置

<!-- 根據(jù)用戶信息查詢 -->
<select id="findUserByCondition" resultMap="userMap" parameterType="user">
        select * from user
        <where>
            <if test="userName != null">
                and username = #{userName}
            </if>
            <if test="userSex != null">
                and sex = #{userSex}
            </if>
        </where>
    </select>

3蠢沿、動態(tài)標(biāo)簽之<foreach> 標(biāo)簽

需求:
傳入多個 id 查詢用戶信息,用下邊兩個 sql 實現(xiàn):
SELECT * FROM USERS WHERE username LIKE '%張%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%張%' AND id IN (10,89,16)
這樣我們在進(jìn)行范圍查詢時匾效,就要將一個集合中的值舷蟀,作為參數(shù)動態(tài)添加進(jìn)來。
這樣我們將如何進(jìn)行參數(shù)的傳遞面哼?

在 QueryVo 中加入一個 List 集合用于封裝參數(shù)

package com.neuedu.domain;

import java.util.List;

public class QueryVo {

    private User user;

    private List<Integer> ids;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

持久層 Dao 接口

    /**
     * 根據(jù)queryvo中提供的id集合野宜,查詢用戶信息
     * @param vo
     * @return
     */
    List<User> findUserInIds(QueryVo vo);

持久層 Dao 映射

    <!-- 根據(jù)queryvo中的Id集合實現(xiàn)查詢用戶列表 -->
    <select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
        select * from user
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

SQL 語句:
select 字段 from user where id in (?)

<foreach>標(biāo)簽用于遍歷集合,它的屬性:
collection:代表要遍歷的集合元素魔策,注意編寫時不要寫#{}
open:代表語句的開始部分
close:代表結(jié)束部分
item:代表遍歷集合的每個元素匈子,生成的變量名
sperator:代表分隔符

編寫測試方法

    /**
     * 測試foreach標(biāo)簽的使用
     */
    @Test
    public void testFindInIds() {
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(42);
        list.add(46);
        vo.setIds(list);

        //執(zhí)行查詢所有方法
        List<User> users = userDao.findUserInIds(vo);
        for (User user : users) {
            System.out.println(user);
        }
    }
image.png

4、sql標(biāo)簽

    <!-- 了解的內(nèi)容:抽取重復(fù)的sql語句-->
    <sql id="defaultUser">
        select * from user
    </sql>
    <!-- 查詢所有 -->
    <select id="findAll" resultMap="userMap">
        <include refid="defaultUser"></include>
        /*select * from user;*/
    </select>
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闯袒,一起剝皮案震驚了整個濱河市炭菌,隨后出現(xiàn)的幾起案子桶蝎,更是在濱河造成了極大的恐慌明郭,老刑警劉巖嬉挡,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喷户,居然都是意外死亡唾那,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門摩骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來通贞,“玉大人朗若,你說我怎么就攤上這事〔郑” “怎么了哭懈?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茎用。 經(jīng)常有香客問我遣总,道長,這世上最難降的妖魔是什么轨功? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任旭斥,我火速辦了婚禮,結(jié)果婚禮上古涧,老公的妹妹穿的比我還像新娘垂券。我一直安慰自己,他們只是感情好羡滑,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布菇爪。 她就那樣靜靜地躺著,像睡著了一般柒昏。 火紅的嫁衣襯著肌膚如雪凳宙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天职祷,我揣著相機與錄音氏涩,去河邊找鬼。 笑死有梆,一個胖子當(dāng)著我的面吹牛是尖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泥耀,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼析砸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爆袍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤作郭,失蹤者是張志新(化名)和其女友劉穎陨囊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夹攒,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蜘醋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咏尝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压语。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啸罢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胎食,到底是詐尸還是另有隱情扰才,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布厕怜,位于F島的核電站衩匣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粥航。R本人自食惡果不足惜琅捏,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望递雀。 院中可真熱鬧柄延,春花似錦、人聲如沸缀程。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠输。三九已至赎败,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢甲,已是汗流浹背僵刮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹦牛,地道東北人搞糕。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像曼追,于是被迫代替她去往敵國和親窍仰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容