MyBatis动态sql:更方便的拼接sql语句
if标签
if标签是最常用的判断语句,相当于java中的if语句。在MyBatis中使用if标签,我们先看一下不使用if标签的时候会有什么情况。
1 | <!-- 多条件查询 用过用户对象中的条件查询用户列表 --> |
在上面的案例中,多条件查询用户性别u_sex,模糊查询用户名u_username,查询用户国籍c_id,返回一个集合。我们在使用条sql语句的时候,我们必须把所有的参数传过来,如果出现我只有查询用户性别u_sex,模糊查询用户名u_username的情况,我们又必须再写一条sql语句。而使用了if标签之后可以解决这个问题。
1 | <!-- 多条件查询 用过用户对象中的条件查询用户列表 --> |
在上面的案例中,当参数u_username传递进映射器时,如果参数不为空则再sql语句上拼接上对用户名的模糊查询,如果为空,则不拼接。这样我们就可以不用写多条sql语句了。但是,如果我们u_sex为空u_username不为空,在sql语句拼接时就会出现select * from user where and u_username like "%"#{u_username}"%"
的错误语法格式。接下来的where标签可以解决这个问题。
where标签
where标签,当标签内的条件成立时,才会加入where这个SQL关键字到组装的SQL里面,否则就不加入,where还可以去掉一些特殊的SQL语法,比如说and、or,它去掉的时前缀的and和or。
1 | <select id="selectUserListByUser" parameterType="User" resultType="User"> |
在上面的案例中,如果and全写在sql拼接语句的后面,当c_cid==null的话,使用where语句就去不掉结尾的and。接下来的trim标签可以解决这个问题。
trim标签
trim标签是要去掉一些特殊的字符串,它又四个属性,prefix、suffix、prefixOverrides、suffixOverrides。下面通过一个例子说一下这四个属性分别代表的意义。
1 | <select id="selectUserListByUser" parameterType="User" resultType="User"> |
prefix=”where”,的意思是在trim头标签加上where之后再拼接上trim内的SQL语句,如果将其换成suffix=”where”的话,就会在trim内的的SQL语句后面接上where,显然在上面的案例中是不对的。
suffixOverrides=”and”,的意思是去掉拼接语句尾部一些不合法的一些特殊字符,比如说and、or,如果将其换成prefixOverrides=”and”的话,就是去掉拼接语句开头一些不合法的的特殊字符。
set标签
set标签在跟新表属性的时候,如果遇上不合法的逗号,会将其去掉。例如:
1 | <update id="updateSetUser" parameterType="User"> |
在上面这个案例中,如果if语句最后一个不成立而它上一个if语句成立的时候,在拼接SQL语句的时候,就会出现SQL语法的错误,而使用set标签可以很好的解决这个错误。下面是使用set标签的案例。
1 | <update id="updateSetUser" parameterType="User"> |
如果最后一个条件1
2
3
4
5
6
7
8
9
10
11
12
13### foreach标签
  foreach标签是一个循环语句,它的作用是遍历集合,它能够很好地支持数组和List、Set接口的集合,对此提供遍历的功能。
  比如说,我要查找数据库中id为1、3、5的用户,SQL语句应该这样写```select * from user where u_id in(1,3,5)```只能固定查3个id的用户,如果要查4个,必须再写一条sql语句,而foreach可以很好的解决这个问题。
```xml
<select id="selectUserListByIds" resultType="User">
select *
from user
where u_id
in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
- collection表示传入的是数组还是集合是数组用array,是集合用list、set等,但如果是包装类的话,则需要使用包装类里面数组或集合的字段名。
- item表示用什么表示数据或者集合里面的数,即循环中当前的元素。
- open、close表示用什么元素把集合两端包起来。
- separate表示用什么分隔。
- index表示当前元素在集合中的位置。
choose、when、otherwise标签
choose、when、otherwise标签类似于java里面的wsitch…case…default…功能语句。下面是一个简单的案例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<select id="selectUserByUser" parameterType="com.xiezhenyu.bean.User" resultType="com.xiezhenyu.bean.User">
select *
from user
<where>
<choose>
<when test="u_id!=null">
and u_id=#{u_id}
</when>
<when test="u_username!=null">
and u_username=#{u_username}
</when>
<otherwise>
and 1=2
</otherwise>
</choose>
</where>
</select>
当传过来的user的id不为空时,按照id为条件去查找,当传过来的id为空而username不为空时按照username去查找,当两个都为空时,查找不到。
sql标签
在写sql语句的时候,有很多重复的语句片段,比如说,1
2
3
4
5
6
7
8
9
10
11
12
13```xml
<sql id="selectUser">
select *
from user
</sql>
<select id="selectUserListByIds" resultType="User">
<include refid="selectUser"/>
where u_id
in
<foreach collection="array" item="id" open="(" close=")" separator="," index="2">
#{id}
</foreach>
</select>
bind标签
bind标签的作用是用过ONGL表达式去定义一个上下文变量,这样更方便使用,例如在进行模糊查询时,MySQL需要用到%和参数连接。
定义接口方法
1 | public List<User> selectUserLikeUsername(@Param("str")String str); |
定义映射文件和一个新的变量,然后执行模糊查询
1 | <select id="selectUserLikeUsername" parameterType="string" resultType="com.xiezhenyu.bean.User"> |
测试方法
1 |
|
原文作者: 谢振瑜
原文链接: https://Xiezhenyu98.github.io/2019/10/19/MyBatis动态sql:更方便的拼接sql语句/
版权声明: 转载请注明出处(必须保留作者署名及链接)