1.choose用法
上节的if标签提供了基本的条件判断,但是无法实现if...else,if..else...这样的逻辑,要实现这样的逻辑,需要用到choose when otherwise 标签,choose元素中包含when和otherwise两个标签,一个choose中至少有一个when,有0个或者一个otherwise。
在sys_user表中出了主键id外,我们认为user_name(用户名)也是唯一的,所有的用户名不可以重复,现在进行下面的查询:当参数id有值时,用id查询,当id没有值时,判断用户名是否有值,如果有值就用用户名查询,如果没有值,就使sql查询无结果。
select id,
user_name userName,
user_password userPassword,
user_email userEmail,
user_info userInfo,
head_img headImg,
create_time createTime
from sys_user
where 1=1
and id= #{id}
and user_name = #{userName}
and 1=2
2.where 、set、trim 用法
2.1 where 用法
where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果后面的字符串是以AND和OR开头就将他们(and和or)剔除。代码如下:
select id,
user_name userName,user_password userPassword,
user_email userEmail,user_info userInfo,
head_img headImg,createTime
from sys_user
and user_name = #{userName}
and user_email = #{userEmail}
2.2 set用法
set标签的作用:如果该标签包含的元素中有返回值,就插入一个set,如果set后面的字符串以逗号结尾的,就将这个逗号剔除。代码如下:
update sys_user
user_name = #{userName},
user_password = #{userPassword},
id = #{id},
where id= #{id}
在set标签的用法中,sql后面的额逗号是没问题了,但是set元素中没有内容,照样会出现sql错误。所以id=#{id}这个仍要保留。这个值得注意。
2.3 trim用法
where 和set 标签的功能都可以用trim标签来实现,并且在底层就是通过TrimSqlNode实现的
where 标签对应的trim的实现如下:
<trim prefix = "where" prefixOverrides="AND | OR ">
....
</trim>
重要:这里的AND和OR 后面的空格不能省略,为了避免匹配到andes,orders等单词。
set 标签对应的trim的实现如下:
<trim prefix = "set" suffixOverrides=",">
.....
</trim>
trim标签有如下属性:
prefix
prefixOverrides
suffix
suffixOverrides