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