个人理解:
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); } }