mybatis学习之路----动态sql之if条件判断各种使⽤⽅式点滴记载,点滴进步,愿⾃⼰更上⼀层楼。
由于需要看到效果,所以这节最好可以将sql语句打印出来。参考
mybatis的if判断语句其实跟el表达式的if条件判断有些类似。
例如: <if test="id != null"> </if>
1 如果参数为数字类型的时候没有特俗需求的情况只需要判断是否为null即可。
例如:<if test="id != null"></if>
如果有特俗需求,例如判断是否⼤于某个数的时候才⾏。只需要加上对应的条件判断即可
例如:<if test='id != null and id > 28'></if>
mybatis对于这种⼤于⼩于等等还有另⼀种形式。
例如:<if test='id != null and id gt 28'></if>
对应关系:
-
--------------------------------------
gt 对应 >
gte 对应 >=
lt 对应 <(会报错 相关联的 "test" 属性值不能包含 '<' 字符)
lte 对应 <=(会报错 相关联的 "test" 属性值不能包含 '<' 字符)
---------------------------------------
2 如果为字符串类型
2.1 如果不需要过滤空串的情况 仅仅判断null即可
例如:<if test="username != null"></if>
2.2 如果需要过滤空串,添加空串判断即可 不⽀持 && 所以这⾥⽤ and or || 来做逻辑与或的判断
例如:<if test="username != null and '' != username"></if> 或者 <if test="username != null and '' neq username"></if>
2.3 如果判断字符串是否已某个特俗字符开头,结尾等。直接调⽤String的对应⽅法即可
例如:<if test="username != null and username.indexOf('ji') == 0"> </if> <!-- 是否以什么开头 -->
<if test="username != null and username.indexOf('ji') >= 0"> </if> <!-- 是否包含某字符 -->
<if test="username != null and username.lastIndexOf('ji') > 0"></if> <!-- 是否以什么结尾 -->
2.4 是否是某个特定字符串,某些业务有此需要。
例如:<if test="username != null and 'hello' == username"></if> 或者<if test="username != null and 'hello' eq username"></if>
注意:
<if test="username != null and 'hello' == username"></if>这种形式的写法在参数类型是字符串的时候是没有问题的,
但是参数类型为⾮字符串类型的时候就需要写成 <if test="username != null and 'hello'.toString() == String()"></if>
仅仅写成<if test="username != null and 'hello'.toString() == username"></if>也会有很⼤可能会挂。
也许你会说⾮字符串的为什么要写成这样。这就要看特俗需要了。
例如:某⼀个sql⽚段是公⽤的,
<if test="username != null"></if>
<if test="password != null"></if>
该⽚段更新条件也⽤,但是当你需要将某⼀个字段更新成null的时候怎么办。
这个时候就可以通过传⼊⼀个特定的字符串来弄。当传⼊的字符串为特定字符串的时候就更新该字符串为null。
<if test="username != null and 'hello'.toString() == String()">xxx=null</if>
当然这样⼦貌似date型会挂。
通过 2.2 也可以看出mybatis对于字符串的相等不相等的判断也是有对应的特俗操作符的。
-------------------------------------------------------
eq 对应 ==
neq 对应 !=
------------------------------------------------------
当然还可以看出来if的条件判断test是⽀持对象⾃⾝⽅法调⽤的,即使是⾃⼰写的⽅法,可以⾃⼰尝试。当然下⾯会有例⼦。例如:⾥⾯可以⽤‘xxxx’.equals(xxxx) 字符串的⽐较两个字符串⽅法
xxxx.indexOf('ss') 判断字符串⾥⾯是否包含某个字符等等
3 判断list是否为空
上⾯说过,if条件判断可以直接调⽤对象⾃⾝的⽅法进⾏逻辑判断,所以list判空。可以调⽤.size()>0或者.isEmpty()
例如:<if test="userList != null and userList.isEmpty()"></if> , <if test="userList != null and userList.size()>0"></if> 4 map参数同同理 取值的话 map.key(map中的key名字)即可
这⾥是上⾯的各种理论的实践。这⾥可以不看,⾃⼰去实践最好。
1 数字类型。
仅作null判断。
当id不为null的时候 打印的log
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=?
DEBUG [main] - ==> Parameters: 28(Integer)
DEBUG [main] - <== Total: 1
当id为null的时候 打印的log
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 1
两项对⽐,可以看出id=?这个条件随着传⼊参数id的变化⽽变化。
当有特俗需求的时候,当前数据库中的表id为28 仅仅有这么⼀条数据,做⼀下轻微的改动 当传⼊id=28的时候
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=?
DEBUG [main] - ==> Parameters: 28(Integer)
DEBUG [main] - <== Total: 1
当传⼊id⼩于28的时候
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 1
接下来测试下⾯这⼏种对应关系。
---------------------------------------
gt 对应 >
gte 对应 >=
lt 对应 <(会报错 相关联的 "test" 属性值不能包含 '<' 字符)
lte 对应 <=(会报错 相关联的 "test" 属性值不能包含 '<' 字符)
---------------------------------------gt
参数 id=25
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
参数 id=28
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=? DEBUG [main] - ==> Parameters: 28(Integer)
>= >= 参数 id=28
[html]
1. <if test ='id != null and id > 27 '>
[html]
1. <if test ='id != null and id gt 27 '>
[html]
1. <if test ='id != null and id >= 28 '>
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=? DEBUG [main] - ==> Parameters: 28(Integer)
参数 id=27
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
gte
[html]
1. <if test='id != null and id gte 28 '>
参数 id=28
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=? DEBUG [main] - ==> Parameters: 28(Integer)
参数 id=27
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
el表达式获取map的值使⽤ < <= 直接报错 "test" 属性值不能包含 '<' 字符 看来只能⽤ lt lte了
lt
[html]
1. <if test='id != null and id lt 28 '>
参数 id=28
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
参数 id=27
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=? DEBUG [main] - ==> Parameters: 27(Integer)
lte
[html]
1. <if test='id != null and id lte 28 '>
参数 id=28
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and id=? DEBUG [main] - ==> Parameters: 28(Integer)
参数 id=29
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
2.1 跟1的第⼀条⼀样不做重复测试
2.2 过滤空串
!=
username=“xiao”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=? DEBUG [main] - ==> Parameters: xiao(String)
username=“”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
neq
[html]
1. <if test="username != null and '' neq username ">
username=“xiao”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=? DEBUG [main] - ==> Parameters: xiao(String)
username=“”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
各个逻辑与或的判断
and上⾯已经弄过了,这⾥弄or || 两种条件
[html]
1. <if test="'xiaohong' eq username or 'xiao' eq username ">
or
username=“xiao”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=? DEBUG [main] - ==> Parameters: xiao(String)
username=“xiaohong”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=? DEBUG [main] - ==> Parameters: xiaohong(String)
username=“xiaofang”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1
DEBUG [main] - ==> Parameters:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论