MyBatis choose、when、otherwise 标签
MyBatis choose、when、otherwise 标签
有些时候,我们不想使用所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis提供了choose标签,它有点像Java中的switch语句。
还是上面的例子,但是这次变为:如果客户端提供了 id 就按 id 查找,提供了 loginname 和 password 就按 loginnam 和password 查找,若两者都没有提供,就返回所有sex = '男'
的 Employee。
- <select id="selectEmployeeChoose" parameterType="hashmap" resultType="my.mybatis.domain.Employee">
- SELECT * FROM tb employee WHERE state = 'ACTIVE'
- <!--- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据-->
- <choose>
- <when test="id != null">
- and id= #{id}
- </when>
- <when test="loginname != null and password != null">
- and loginname = #{loginname} and password = #{password}
- </when>
- <otherwise>
- and sex = '男'
- </otherwise>
- </choose>
- </select>
- List<Employee> selectEmployeeChoose(HashMap<String,Object> params);
-
- public void testSelectEployeeChoose(SqlSession session)
- {
- EmployeeMapper em = session.getMapper(EmployeeMapper.class);
- HashMap<String, Object> params = new HashMap<String, object>();
- // 设置id属性
- params.put("id", 1);
- params.put("loginnamc", "jack");
- params.put("password", "123456");
- List<employee> list = em.selectEmployeechoose(params);
- list.forEach(employee -> Systen.out.printIn(employee));
- }
-
运行main 方法,尝试selectEmployeeChoose()方法,控制台显示如下:
- DEBUG [main]==> Preparing: STTR.CT FROM tb_employee WHERE state = 'ACTIVE' and loginname = ? and password = ?
- DEBUG [main]==> Parameters: jack(String),123456(String)
-
- DEBUG [main]==> Total :1
- [Employee [id=1,loginname=jack,passwiord=123456,name=马云,sex=男,age=26,phone=13902019999,sal=9800.0,state=ACTIVE] ]
可以看到,HashMap里面传递的参数包括了id、loginname和password,执行的sql语句中因为使用了choose标签,所以sql语句执行的是按照id查询,查询返回的Emplyee对象就是id为1的对象。
接下来注释以下代码:
- // params.put("id",1) ;
再次执行main方法,控制台显示如下:
- DEBUG [main]==> Prcparing: SEIECT * FROM tb_employee WHERE state = 'ACTIVE' and login name= ? and password = ?
- DEBUG [main]==> Parameters: jack(String) ,123456(String)
- DEBUG [main]<== Total :1
- Employee [id=1,loginname=jack,passwiord=123456,name=马云,sex=男,age=26,phone=13902019999,sal=9800.0,state=ACTIVE]
可以看到,HashMap里面传递的参数只包括loginname和password,所以sql语句是按照loginname和password查找,查询返回的Emplyee对象就是loginname,即jack,并且password是123456的对象。
接下来注释以下代码:
- // params.put("id",1);
- // params.put("loginname","jack");
- // params.put("password","123456");
再次执行main 方法,控制台显示如下:
- DEBUG [main]==> Preparing: SELECT * FROM tb_employee WHERE state = 'ACTIVE' and sex = '男'
- DEBUG [main]==> Parameters:
- DEBUG [main]==> Total :2
- Employee [id=l,name= 杰克,sex=男,age=26,password=123456,loginname=jack,phone=13902019999,sal=9800.0,state=ACTIVE]
- Employee [id=3,name=汤姆,sex=男,age=25,loginname=tom,password=123456,phone=13902017777,sal=8800.0,state=ACTIVE]
可以看到,由于没有传递任何参数,故sql语句执行的是<otherwise>
元素里面的查询条"sex='男'"的对象。