前面几个例子已经很好地解决了动态SQL问题。现在回到之前的if示例,这次我们将state="ACTIVE"也设置成动态的条件,看看会发生什么。
SELECT * FROM tb_employee WHERE
state= #{state}
and id = #{id}
如果传入state参数,则执行正常。如果没有传入参数,则会执行sql语句:
SELECT * EROM tb_employee WHERE
如果只是传入id,则会执行sql语句:
SELECT * FROM tb_ employee WHERE and id = ?
也就是说,如果没有传入state参数,会导致执行失败。这个问题不能简单地用条件语句来解决。MyBatis有一个简单的处理方法,只要简单地修改就能得到想要的效果:
SELECT * EROM tb_employee
state = #{state}
and id = #{id}
and loginname = #{loginname} and password = #{password}
where元素知道只有在一个以上的if条件有值的情况下才去插入WHERE子句。而且,若最后的内容是“AND”或“OR”开头,则where元素也知道如何将它们去除。
List selectEmployeeLike (HashMap params) ;
public void testSelectEmployeeLike(SqlSession session) {
EmployeeMapper em = session.getMapper(EmployeeMapper.class);
HashMap params = new HashMap();
// 设置id,loginname和password属性
params.put("id",1);
params.put("loginname","jack");
params.put("password","123456");
List list = em.selectEmployeelike(params);
list.forEach(employee-> System.out.printIn(employee) );
}
测试selectEmployeeLike方法,控制台显示如下:
DEBUG [main]==> Preparing: SELECT * FROM tb_employee WHERE id = ? and loginname= ? and password = ?
DEBUG [main]==> Parameters: 1(Integer),jack(String),123456(string)
DEBUG [main]==> Total: 1
Employee [id=1,paasword=12345,name=杰克,sex=男,age=26]
loginnamejack,
phone=13902019999,sal=9800.0,state-ACTIVE]
可以看到,当没有传入state 参数时,MyBatis 自动过滤掉id 前面的and 关键字。
关注微信公众号获取更多VSCode编程信息,定时发布干货文章
全部评论