mybatis——动态sql之if条件判断各种使⽤⽅式点滴记载,点滴进步,愿⾃⼰更上⼀层楼。
⽤mybatis执⾏数据库操作仅仅能看到执⾏结果,如果想看到执⾏的sql语句怎么办。
查阅mybatis官⽅⽂档到了解决⽅法。
配置什么的很简单,⽤的log4j打印,当然参照官⽅⽂档还有好⼏种⽅法,具体⾃弄。
这⾥仅作记录只⽤。配置很简单,将log4j架包加⼊到classpath⾥。
maven配置。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
⾮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为你的l的namespace
如果我的xml中的namespace为dynamic
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间,跟java的package类似,避免sql id重复,
有了这个命名空间,别的xml中的sql的id可以跟这个重复,并且 namespace不能省略,不能为空,不⽤接⼝开发,此处可以随意写-->
<mapper namespace="dynamic">
<resultMap id="userMap" type="st.model.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="create_date" property="createDate"/>
</resultMap>
<!--if 标签使⽤类似html的C标签的if -->
<select id="selectUseIf" parameterType="st.model.User" resultMap="userMap">
select * from t_user where
<if test="id != null and id != ''">
id=#{id}
</if>
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</select>
</mapper>
配置完成。现在运⾏测试即可看到运⾏的sql语句
-
-----------------------------------------------------------------------------------------------------------------------------
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条件判断有些类似。
例如: <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名字)即可
----------------------------------------------------------------------------------------------分割线01-----------------------------------------------------------------------------------------------------------
这⾥是上⾯的各种理论的实践。这⾥可以不看,⾃⼰去实践最好。
1 数字类型。
仅作null判断。
<!--if 标签使⽤类似html的C标签的if -->
<select id="selectUseIf" parameterType="st.model.DynamicTestModel" resultMap="userMap">
select * from t_user where 1=1
<if test='id != null'>
and id=#{id}
</if>
</select>
当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 仅仅有这么⼀条数据,做⼀下轻微的改动
<if test='id != null and id > 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 对应 <(会报错相关联的 "test" 属性值不能包含 '<' 字符)
lte 对应 <=(会报错相关联的 "test" 属性值不能包含 '<' 字符)
---------------------------------------
gt
<if test='id != null and id gt 27 '>
参数 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)
>=
<if test='id != null and id >= 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
<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:
使⽤ < <= 直接报错 "test" 属性值不能包含 '<' 字符看来只能⽤ lt lte了
lt
<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
<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:
----------------------------------------------------------------------------------------------分割线02----------------------------------------------------------------------------------------
-------------------
2.1 跟1的第⼀条⼀样不做重复测试
2.2 过滤空串
<select id="selectUseIf" parameterType="st.model.DynamicTestModel" resultMap="userMap"> select * from t_user where 1=1
<if test="username != null and '' != username ">
and username=#{username}
</if>
</select>
!=
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
<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 || 两种条件
<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:
||
username=“xiao”
DEBUG [main] - ==> Preparing: select * from t_user where 1=1 and username=? DEBUG [main] - ==> Parameters: xiao(String)
el表达式执行结果为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:
2.3 indexOf() lastIndexOf() 判断是否包含某个特定字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论