mybatis 基礎(二) 動態sql 關於where if / where choose when otherwise


個人理解:
where if就相當於正常的java中的if 語句,如果有多個條件組合判斷的話用 and, or連接

而where choose when otherwise
choose就好像是switch,when相當於case,可以有一種屬性的對個判斷,但不能同時去判斷多個屬性. 同時,只要有一個when滿足,則break
otherwise就好像是default,如果前面的when都不滿足,則進入otherwise

1.動態sql where if
傳遞參數為實體類user,if內的userName是user的屬性 username=#{userName} 中的username是數據庫表中的字段, #{userName}是實體類user中的.

 <select id="findByCondition" parameterType="user"  resultType="user">
        select * from user
        <!-- 這里的userName 對應的也是實體類中的屬性-->
        <!--  test里面的屬性基本都來自於parameterType中的,如這里的userName,是實體類user中的屬性-->
        <where>
            <if test="userName!=null">
                username=#{userName}
            </if>
            <if test="gender!=null">
                and gender=#{gender}
            </if>
        </where>
    </select>

 @Test
    public void testFindByCondition() throws  Exception{
        User user=new User();
        user.setUserName("xxx");
        user.setGender("男");
        List<User> list = userDao.findByCondition(user);
        for (User user1:list)
        {
            System.out.println(user1);
        }
    }

2.同時,if中可以由多個條件的拼接,如這里的ids !=null and ids.size()>0 或者是ids !=null and user!=null 這樣的多個條件的拼接.

<!--多個id,新建實體類,傳入id集合,並用foreach標簽遍歷ids-->
    <select id="findByIds" parameterType="vo"  resultType="user">
        select * from user
        <!-- 這里的userName 對應的也是實體類中的屬性-->
        <where>
           <!--這里的ids 是vo里面的屬性. -->
            <if test="ids !=null and ids.size()>0">
               <!--這里的item對應的是user里面的屬性字段-->
                <foreach collection="ids" open=" uid in (" close=")"  item="uid" separator=",">
                  #{uid}
                </foreach>
             </if>
        </where>
    </select>

 @Test
    public void testFindByIds() throws  Exception{
        Vo vo=new Vo();
        List<Integer> list=new ArrayList<>();
        list.add(2);
        list.add(5);
        list.add(7);
        vo.setIds(list);
        List<User> users = userDao.findByIds(vo);
        for (User user:users)
        {
            System.out.println(user);
        }
    }

3.但是如果是where choose when otherwise 的時候,切記不能使用不同屬性條件的拼接,如 a1 and b2 這樣是不可以的, 但是可以 a!=null and a==1 這樣,對同一個屬性進行不同的判斷

 <select id="findByChoose" resultType="user" parameterType="user">
        select * from user
        <where>
            <choose>
                <!-- 這里test為雙引號,則代表里面應該是字符串,而'男' 會默認為字符.所以gender=='男' 會出現不匹配錯誤,所以這里需要toString() -->
                <when test=" gender!='女'.toString() and gender=='男'.toString()">
                    age=22
                </when>
                <!--這里寫成單引號,內部可以使用雙引號-->
               <!-- <when test=' gender=="男" '>
                    age=22
                </when>-->
                <otherwise>
                    age=23
                </otherwise>
            </choose>
        </where>
    </select>


  @Test
    public  void testFindByChoose() throws  Exception{
        User user=new User();
        user.setUserName("aaa");
        user.setGender("男");
        user.setAge(22);
        List<User>  users= userDao.findByChoose(user);
        for (User user1:users){
            System.out.println(user1);
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM