前言
上篇博文把表连接查询和三种对应关系的写法记录总结了,本篇要把 mybatis 中的动态sql 的使用以及缓存知识记录下来。
动态SQL
在解释 where if 标签之前先进行一个模糊查询的操作。
模糊查询
如下面一张表:
查询所有 李 姓人员的信息:
在mapper接口中定义方法:
List<Person> selectName(String name);
在 xml 中编写 sql 语句:
<select id="selectName" resultMap="personMap"> select * from t_person where person_name like concat('%', #{name}, '%'); </select>
这里的 concat('%', #{name}, '%') 写法使用了字符串拼接的技巧,这样在查询语句里就是 %name% 的模糊查询了。
如果这样写:'%#{name}%' 是不行的,#{}会失效。
编写测试类:
测试结果:
可以看到所有 李 姓的人信息被查询到了。
where if 标签
姓李的太多,那么我们可以加一个年龄范围,于是需要增加两个参数:
这里要注意,参数在两个以上需要使用 注解 来绑定。
重点来看 xml中的 sql 语句:
<select id="selectContent" resultMap="personMap"> select * from t_person <where> <if test="name != null and name !=''"> person_name like concat('%',#{name},'%') </if> <if test="ageMin > 0"> and age >= #{ageMin} </if> <if test="ageMax > ageMin"> and age <= #{ageMax} </if> </where> </select>
可以看到这里的 where 关键字变成了一个标签 <where>,这是因为:
如果这三个参数都不填写的话,where 下的条件就不会起作用,
此条 sql 就变成了查询所有。
显然,查询所有的语法里是没有 where 关键字的,因此使用标签代替。
除了使用 <where> 标签之外,也可以使用类似 1=1 加 and 的方法拼接。
比如: select * from t_person where 1=1 and ...
此外,where 标签还可以去除多余的 and 前缀。
if 标签用来做判断,test 里写判断的条件,标签内写判断成功后的 sql 语句:
这里就是判断名字是否为空以及年龄的取值范围是否合理:
test 里面的符号正常写,and 和 or 代表并且和或者。
sql 语句里,> 是大于的意思,< 是小于的意思。
编写测试类:
测试结果:
很明显,年龄在 20~28 且姓李的只有 “李白” 自己。