MyBatis的動(dòng)態(tài)sql

??我們之前在配置文件中寫的sql都是死代碼,每次查詢需要不同的條件都需要去修改sql語(yǔ)句,如果我們將sql語(yǔ)句設(shè)置成動(dòng)態(tài)的,就可以根據(jù)參數(shù)的不同進(jìn)行不同的查詢了。

一、if判斷

??我們可以通過(guò)if語(yǔ)句對(duì)傳入的參數(shù)進(jìn)行判斷,檢查是否有此參數(shù),如果條件參數(shù)為空或空字符串,那么就不添加這個(gè)條件;如果有這個(gè)條件參數(shù),就進(jìn)行條件查詢。
第一步:定義接口中的方法

    //動(dòng)態(tài)sql:if判斷
    List<User> queryUserList(User user);

第二步:在配置文件中添加sql語(yǔ)句

<!-- 1=1:如果沒(méi)有這個(gè)恒等式,if條件滿足了,sql語(yǔ)句的拼接就會(huì)出現(xiàn)問(wèn)題
         if里面的test:用于添加if判斷的條件
     -->
    <select id="queryUserList" resultType="domain.User">
        select * from user where 1=1
        <if test="id != null ">
        and id = #{id}
        </if>
        <if test="address != null and address != ''">
        and address = #{address}
        </if>
    </select>

第三步:在測(cè)試類中進(jìn)行測(cè)試

    @Test
    public void getUserIf() throws Exception {
        UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
        User user = new User();
        user.setId(16);
        user.setAddress("上海");
        List<User> list = mapper.queryUserList(user);
        for (User user2 : list) {
            System.out.println(user2.toString());
        }
    }

二、where

??在我們不知道是否有查詢條件的時(shí)候,如果只使用if進(jìn)行判斷的話,還需要添加一個(gè)恒等條件,防止sql語(yǔ)句出現(xiàn)問(wèn)題;如果我們配合where標(biāo)簽使用,就會(huì)非常簡(jiǎn)單。
修改上面案例中的配置文件,然后進(jìn)行測(cè)試

    <select id="queryUserList" resultType="domain.User">
        select * from user
        <where>
            <if test="id != null ">
                and id = #{id}
            </if>
            <if test="address != null and address != ''">
                and address = #{address}
            </if>
        </where>
    </select>

三、foreach

??sql語(yǔ)句中可以使用in進(jìn)行范圍查詢,如果我們想要實(shí)現(xiàn)動(dòng)態(tài)輸入范圍,就需要使用foreach。
接口添加方法

    //使用in范圍查詢
    List<User> queryUserIn(List<Integer> list);

在配置文件中添加sql語(yǔ)句

  • collection:屬性值應(yīng)該與我們輸入映射的參數(shù)一致
  • open:指定我們開(kāi)始的連接部分
  • close:指定我們結(jié)束部分的連接
  • separator:指定連接的連接符
  • item:表示我們循環(huán)迭代的別名
<select id="queryUserIn" resultType="domain..User">
        select * from user
        <where>
            <foreach collection="list" open=" id in (" close=")" separator="," item="id">
                #{id}
            </foreach>
        </where>
    </select>

在測(cè)試類中進(jìn)行測(cè)試

@Test
    public void queryUserIn() throws Exception {
        UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
        List<Integer> list = new ArrayList<Integer>(); 
        list.add(1);
        list.add(10);
        list.add(16);
        list.add(22);
        List<User> userList = mapper.queryUserIn(list);
        for (User user : userList) {
            System.out.println(user.toString());
        }
        sqlSession.close();
    }

四、sql片段

??sql片段可以用來(lái)存放我們需要查詢的內(nèi)容。
接口中添加方法

    //使用sql片段查詢
    List<User> getUsers(User user);

在配置文件中添加sql語(yǔ)句

<!-- sql片段 -->
    <sql id="baseSql">
        id,username,birthday,sex,address
    </sql>
    
    <select id="getUsers" resultType="domain.User">
        select <include refid="baseSql"/>
        from user where
        address like '%${address}%'
    </select>

在測(cè)試類中進(jìn)行測(cè)試

    @Test
    public void queryUsers() throws Exception {
        UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
        User user = new User();
        user.setAddress("上海");
        List<User> list = mapper.getUsers(user);
        for (User user2 : list) {
            System.out.println(user2.toString());
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 寫在前面:十分感謝《深入淺出Mybatis技術(shù)原理與實(shí)戰(zhàn)》這本書(shū),大多數(shù)部分是書(shū)上的話,希望自己能在后面的文章中多...
    AceCream佳閱讀 463評(píng)論 0 2
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,545評(píng)論 0 85
  • 很長(zhǎng)時(shí)間沒(méi)有發(fā)表文字。不是心中無(wú)字,只是有的心情,現(xiàn)在不合適發(fā)表。 一直都在用丘丘記錄,雖然很多好友現(xiàn)在不玩空間,...
    藍(lán)霞紫雨閱讀 180評(píng)論 0 0
  • 今天是冬至,二十四節(jié)氣中的一天。 這一天并沒(méi)有什么不同,依舊是星期二,依舊早上九點(diǎn)起床,半小時(shí)后出門,買好早餐去上...
    冷汐閱讀 360評(píng)論 0 0

友情鏈接更多精彩內(nèi)容