mybatis之动态sql
1.1. foeach标签
例:
原始的sql语句: select * from emp IN (1001,1003,1006,1009)
分析:
此时括号中的查询条件为多个数值,此时我们应该想到用list集合去装载该多个数值,list中的数值我们通常都要用遍历的方式获取其中的值。此时我们就需要在xml(当前的映射文件)中使用到foeach标签。
foeach标签所包含的属性:
- collection: 是一个固定的,表示遍历的开始
- item: 为所需要遍历的对象起一个别名
- open: sql开始拼接的字符串(拼接完毕后就开启循环)
- separator: 设置每个循环对象之间的分隔符
- close: 最后循环完毕之后拼接的字符串
xml文件中的实现:
<!-- 原始的sql语句: select * from emp IN (需要遍历list集合获取的数值) -->
<select id="findEmployerByIds" parameterType="java.util.List" resultType="emp">
select * from emp where id
<foreach collection="list" item="eid" open=" IN (" separator="," close=")">
#{eid}
</foreach>
</select>
1.2. where标签和if标签
首先分析它们的应用场景(模糊查询):
我们经常在使用淘宝之类的软件时会使用它们的筛选功能,他们有多种可以筛选的条件,这个时候客户只要按自己的需求填入自己需要筛选的字段即可。
我们知道日常开发中后端的数据都是由前台传递过来的,当用户输入筛选的字段或者字段的个数不同时,我们就需要进行sql语句的动态的改变,如果我们对每一种情况都写出不同的查询的sql语句或者每次都要对传入的字段进行判断,这样会大大增加我们的代码量以及其复杂度。此时我们有什么解决的办法呢,这个时候where和if标签的出场将大大的解决我们的问题。
where标签和if标签一般搭配使用
1.2.1. where标签的使用
我们在使用where条件查询的时候,可以直接敲出标签,然后将要查询的字段写在该标签之内即可,如果where标签中的各种查询条件都不满足一定的约束,where在之后的sql语句运行时会自动消失(可在后面的if标签中看到详细的应用)
1.2.2. if标签的使用
在平常的开发中,我们知道if就是做判断用的,此处也不例外
if标签中的属性:
test: 在该属性中写判断的条件,如果判断为false,if标签中的该语句就不会在where后进行条件的拼接
<if test="xxx != null ">
xxxxxxx
</if>
1.2.3. where和if的配合使用
select * from product
<where>
<if test="price != null ">
price=#{price}
</if>
<if test="pname != null ">
and pname=#{pname}
</if>
</where>
很多人在执行这里时会有疑问,如果where后面拼接的第一个满足的条件的语句中带有and 岂不是就变成 where and xxxx 了,这样就不会符合sql语句的语法规范了,会报错。这点完全不用东西,标签的设计者想到了这个,如果where后第一个拼接的语句带有and,它会自动消掉and,这样就完全不用担心会出问题了。
1.3. sql片段的抽取
应用场景的分析:
- 如果我们在xml中的多个增删改查的标签中用到了同一条sql语句,考虑到代码复用性的原则,我们完全可以将改句sql语句抽取出来。
- 如果我们某一天要对多处用到的相同的sql语句进行某个地方的修改,如果有一万条相同的,我们就需要去改一万遍。如果我们对该条sql语句进行sql片段的抽取即可,然后在每一个用到相同的sql语句的增删改查的标签中通过引用该片段就行了。之后只需要修改该一个片段就可以达到修改多个地方的效果了。
例:假如select * from user 为一条在多个标签中复用性极高的sql语句
此时我们对该条语句就行sql片段的抽取,此时我们要用到sql标签
<!-- id为类似于为该sql语句片段设置唯一的标识-->
<sql id="selectUser" > select * from user </sql>
对该sql片段的引用要用到include标签(是不是感觉很熟悉,jsp的动态资源加载)
示例:
<select id="findEmployerByIds" resultType="user">
<!-- 此处的refid属性代表要引用的 某sql片段的id值-->
<include refid="selectUser"></include>
</select>