欢迎访问:我的个人网站
创建动态SQL语句
一个statement的编写可以看作是对特定接口的某一方法的实现,在对每个方法实现的过程中,常使用select、update、delete、insert标签来表明方法操作所属的类别。在编写的时候,**可以配合使用其他标签进行statement的创建,包括sql片段标签,where标签、if标签,foreach标签,**来将所编写的statement标签作为一个动态的SQL语句存在。具体的使用实例如下:
##1.SQL片段
当一个映射文件对一个接口进行 “实现” 的时候,如果存在重复的实现逻辑代码。那么可以将该部分的代码通过SQL片段的形式单独抽离出来,然后在其它地方进行引用。以提高利用,具体的使用形式如下:
<!--id指的就是该SQL片段的唯一标识,后续在进行引用的时候会使用到-->
<sql id="SQL_01">
<!--
指定共用的代码片段
-->
</sql>
后续进行引用的时候需要在使用的地方用标签include来进行引入。需要指定属性refid为所要引入的SQL片段id
<inclide refid="SQL_01"></include>
##2.if与where标签
这两个标签通常配合进行使用,来创建满足条件的动态SQL语句。if标签用于对给定的表达式进行判断,当所给的条件判断为真的时候,则将if标签体中的内容加入到最终渲染的SQL语句里面。而这个所判断的条件需要作为属性test 的值来传入。if标签体的内容一般作为条件存在。而where标签会渲染为SQL语句的where,并且会自动的将语句的第一个and字符移除,以保持SQL语义的正确。实例如下:
<select id="search" parameterType="user" resultType = "user">
select * from tb_user
<where>
<if test="id!=null and id!=-1">
<!-- 传入的id不为空且不等于-1, 则把下面的语句添加到最终的SQL语句里面 -->
and id =#{id}
</if>
<if test="name!=null and name!='' ">
and name like '%${name}%'
</if>
</where>
</select>
以上所创建的statement是对一个搜索用户的方法的实现,where以及if标签所实现的语义为:
- 当所传入的user对象的属性id不为空以及-1的时候,那么SQL语句就会渲染为:
- select * from tb_user where id = #{id}
- 当所传入的user对象的属性name与id都满足test的测试条件时,则渲染为:
- select * from tb_user where id = #{id} and name like ‘%${name}%’
##3.foreach标签
用于使用循环的方法来创建动态SQL语句,比如对多个具有相同特征的语句段进行处理的时候,可以使用foreach进行循环,来创建最终的语句,foreach标签具有几个属性存在,他们的含义如下:
- collection : 遍历的对象
- item:每次遍历时候所获得的对象
- open:开始遍历时候要拼接的串
- close:结束遍历时候需要拼接的串
- separator:每次遍历时要在两个对象中间添加的串
如果给定一个user对象里存在一个int数组ids,数组内的每个数据表示所要获得User对象的id,那么就可以使用foreach标签创建如下形式的语句:
select * from tb_user where id = 1 or id = 3 or id = 4 or id = XXX
而使用foreach标签进行创建的实例如下:
<select id="selectByIds" resultType="user" parameterType="user">
select * from tb_user
<where>
<foreach collection="ids" close="" open="" separator="or" item="id" index="">
<!--每次遍历需要拼接的串 -->
id =#{id}
</foreach>
</where>
</select>