mybatismysqlif函数_mybatis——动态sql之if条件判断各种使
⽤⽅式
点滴记载,点滴进步,愿⾃⼰更上⼀层楼。
⽤执⾏数据库操作仅仅能看到执⾏结果,如果想看到执⾏的sql语句怎么办。
查阅mybatis官⽅⽂档到了解决⽅法。
配置什么的很简单,⽤的打印,当然参照官⽅⽂档还有好⼏种⽅法,具体⾃弄。
这⾥仅作记录只⽤。配置很简单,将log4j架包加⼊到classpath⾥。
配置。
log4j
log4j
1.2.17
⾮maven项⽬只需要将jar添加到项⽬中即可。
log4j.properties添加到source根⽬录。
# Global logging configuration
# MyBatis
#log4j.st.dao=DEBUG
log4j.logger.dynamic=DEBUG
#ample.BlogMapper=TRACE
#
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
其中关键的地⽅是
log4j.logger.dynamic=DEBUG
log4j.logger是固定的,dynamic为你的mapper.的namespace
如果我的xml中的namespace为dynamic
/p>
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/mybatis-3-mapper.dtd">
select * from t_user whereid=#{id}
and username like concat('%',#{username},'%')
and password=#{password}
配置完成。现在运⾏测试即可看到运⾏的
------------------------------------------------------------------------------------------------------------------------------DEBUG [main] - ==> Preparing: select * from t_user where id=? and username like concat('%',?,'%') DEBUG [main] - ==> Parameters: 28(Integer), xiao(String)
DEBUG [main] - <== Total: 1
-------------------------------------------------------------------------------------------------------------------------------mybatis的if判断语句其实跟el表达式的if条件判断有些类似。
例如:
1 如果参数为数字类型的时候没有特俗需求的情况只需要判断是否为null即可。
例如:
如果有特俗需求,例如判断是否⼤于某个数的时候才⾏。只需要加上对应的条件判断即可
例如:
mybatis对于这种⼤于⼩于等等还有另⼀种形式。
例如:
对应关系:
---------------------------------------
gt 对应 >
gte 对应 >=
lt 对应
lte 对应 <=(会报错 相关联的 "test" 属性值不能包含 '
---------------------------------------
2 如果为字符串类型
2.1 如果不需要过滤空串的情况 仅仅判断null即可
例如:
2.2 如果需要过滤空串,添加空串判断即可 不⽀持 && 所以这⾥⽤ and or || 来做逻辑与或的判断
例如: 或者
2.3 如果判断字符串是否已某个特俗字符开头,结尾等。直接调⽤String的对应⽅法即可
例如:
2.4 是否是某个特定字符串,某些业务有此需要。
例如: 或者
注意:
这种形式的写法在参数类型是字符串的时候是没有问题的,
但是参数类型为⾮字符串类型的时候就需要写成
仅仅写成也会有很⼤可能会挂。
也许你会说⾮字符串的为什么要写成这样。这就要看特俗需要了。
例如:某⼀个sql⽚段是公⽤的,
该⽚段更新条件也⽤,但是当你需要将某⼀个字段更新成null的时候怎么办。
这个时候就可以通过传⼊⼀个特定的字符串来弄。当传⼊的字符串为特定字符串的时候就更新该字符串为null。
xxx=null
当然这样⼦貌似date型会挂。
通过 2.2 也可以看出mybatis对于字符串的相等不相等的判断也是有对应的特俗操作符的。
-------------------------------------------------------
eq 对应 ==
neq 对应 !=
------------------------------------------------------
当然还可以看出来if的条件判断test是⽀持对象⾃⾝⽅法调⽤的,即使是⾃⼰写的⽅法,可以⾃⼰尝试。当然下⾯会有例⼦。
例如:⾥⾯可以⽤‘xxxx’.equals(xxxx) 字符串的⽐较两个字符串⽅法
xxxx.indexOf('ss') 判断字符串⾥⾯是否包含某个字符等等
3 判断list是否为空
上⾯说过,if条件判断可以直接调⽤对象⾃⾝的⽅法进⾏逻辑判断,所以list判空。可以调⽤.size()>0或者.isEmpty()
例如: ,
4 map参数同同理 取值的话 map.key(map中的key名字)即可
----------------------------------------------------------------------------------------------分割线01-----------------------------------------------------------------------------------------------------------
这⾥是上⾯的各种理论的实践。这⾥可以不看,⾃⼰去实践最好。
1 数字类型。
仅作null判断。
select * from t_user where 1=1and id=#{id}
当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
el表达式获取map的值DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 1
两项对⽐,可以看出id=?这个条件随着传⼊参数id的变化⽽变化。
当有特俗需求的时候,当前数据库中的表id为28 仅仅有这么⼀条数据,做⼀下轻微的改动
27 '>
当传⼊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 对应
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)
>=
= 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:
gte
参数 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:
使⽤ < <= 直接报错 "test" 属性值不能包含 '
lt
参数 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
参数 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:
----------------------------------------------------------------------------------------------分割线02-----------------------------------------------------------------------------------------------------------
2.1 跟1的第⼀条⼀样不做重复测试
2.2 过滤空串
select * from t_user where 1=1and username=#{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:
neq
username=“xiao”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论