10.2 MyBatis动态SQL 10.2.1 if标签
10.2 MyBatis动态SQL 10.2.1 if标签
10.2.1 if标签
动态SQL
通常会做的事情是有条件地包含where
子句的一部分。比如:
1 |
|
以上语句提供了一个可选的根据id
查找Employee
的功能。
- 如果没有传入
id
,那么所有处于active
状态的Employee
都会被返回; - 反之传入了
id
,那么所有处于active
状态以及指定id
内容的Employee
结果返回。
1 | public interface EmployeeMapper { |
以上代码提供了一个和EmployeeMapper.xml
中的select
元素的id
同名的方法,需要注意的是,selectEmployeeByStateIfId
接受一个HashMap
作为参数。
mybatis参数获取方式
在MyBatis
中,#{id}
表达式获取参数有两种方式:
- 一是从
HashMap
中获取集合的property
对象; - 二是从
Javabean
中获取property
对象;
测试if标签
1 | package test; |
运行结果
运行OneIfTest
类的main
方法,main
方法中通过SqlSession
的getMapper(Class<T> type)
方法获得mapper
接口的代理对象EmployeeMapper
。调用selectEmployeeByStateIfId
方法时会执行EmployeeMapper.xml
中id="selectEmployeeByStateIfId"
的select
元素中定义的SQL
语句。控制台显示如下:
DEBUG [main] ==> Preparing: select * from tb_employee where state='active' and id=? DEBUG [main] ==> Parameters: 1(Integer) DEBUG [main] <== Total: 1 Employee [id=1, loginname=xiaoming, password=xiaoming, name=小明, sex=男, age=19, phone=123456789123, sal=9800.0, state=active]
可以看到,执行的SQL
语句中因为传入了id
属性,所以SQL
语句中包含了”and id=?
“,查询返回state=ACTIVE
并且id
为1
的数据。只得到一个id
为1
的Emplyee
对象。
不传入参数的情况
接下来注释main
方法中往HashMap
中设置键值对的put
方法,如下代码所示:
1 | public static void main(String[] args) |
运行效果
再次执行main
方法,控制台显示如下:
DEBUG [main] ==> Preparing: select * from tb_employee where state='active' DEBUG [main] ==> Parameters: DEBUG [main] <== Total: 4 Employee [id=1, loginname=xiaoming, password=xiaoming, name=小明, sex=男, age=19, phone=123456789123, sal=9800.0, state=active] Employee [id=2, loginname=xiaowang, password=xiaowang, name=小王, sex=男, age=21, phone=123456789123, sal=6800.0, state=active] Employee [id=3, loginname=xiaoli, password=xiaoli, name=小丽, sex=女, age=23, phone=123456789123, sal=7800.0, state=active] Employee [id=4, loginname=xiaofang, password=xiaofang, name=小芳, sex=女, age=22, phone=123456789123, sal=8800.0, state=active]
可以看到,由于传递的HashMap
中没有id
属性,故执行的SQL
语句中不再包含”and id=?
“,查询语句返回了所有state=ACTIVE
的数据。得到了多个Employee对象。
if标签中使用多个条件
如果想通过两个或多个条件搜索该怎么办呢?很简单,只要多加入一个或多个条件即可以。
使用多个and语句
在EmployeeMapper.xml
中添加入下select
标签:
1 | <!-- 测试多个if标签 --> |
mapper接口方法
在EmployeeMapper.java
接口中添加入下方法:
1 | List<Employee> selectEmployeeByStateIfLoginnamePassword(HashMap<String, Object> params); |
测试类
1 | package test; |
运行结果
运行测试类DoubleIfTest
,控制台显示效果如下:
DEBUG [main] ==> Preparing: select * from tb_employee where state='active' and loginname = ? and password = ? DEBUG [main] ==> Parameters: xiaoming(String), xiaoming(String) DEBUG [main] <== Total: 1 Employee [id=1, loginname=xiaoming, password=xiaoming, name=小明, sex=男, age=19, phone=123456789123, sal=9800.0, state=active]
可以看到,执行的SQL
语句中因为传入了loginname
和password
属性,故SQL
语句中包含了”and loginname=? and password=?
“,查询返回的Emplyee
对象就是loginname
是xiaoming
,并且password
是xiaoming
的对象。