首页 > 数据库技术 > 详细

mybatis 基础(二) 动态sql 关于where if / where choose when otherwise

时间:2019-10-09 15:21:46      阅读:96      评论:0      收藏:0      [点我收藏+]

个人理解:
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 的时候,切记不能使用不同属性条件的拼接,如 a==1 and b==2 这样是不可以的, 但是可以 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);
        }
    }

mybatis 基础(二) 动态sql 关于where if / where choose when otherwise

原文:https://www.cnblogs.com/chq1024/p/11641503.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!