mybatis中xml字段空判断及模糊查询

由于业务特殊的查询需求,需要下面的这种查询,一直感觉模糊不清,本地测试一下顺便做个总结


贴一段xml代码,如下:

1 <if test="receivedName != null and receivedName != '' ">
2     AND receivedName = #{receivedName}
3 </if>
4 <if test="receivedName == null">
5     AND receivedName is null
6 </if>

注意下面几点:

1、如果java代码中有receiveName这个参数且receiveName="jack",那么这种情况是满足上面第一种情况的,到mybatis中,转换sql语句就是“select * from table where receivedName="jack";”;
2、如果java代码中有receivedName这个字段且receivedName="",那么这种情况是不满足上面的两个条件的,到mybatis中,转换sql语句就是“select * from table where 1=1;”
3、如果java代码中没有receivedName这个参数,这里是满足 "receivedName == null" 这种情况的,到mybatis中,转换为sql语句就是“select * from table where receivedName is null;”

 

这里要注意,不管你的查询参数有几个,如果你传递的参数中不包含receiveName这个参数,那么,默认的查询sql至少会有一个条件是 “receivedName is null”,因为这个默认的条件,所以今天上午感觉数据查询结果像见鬼了一样,其实也是自己考虑不周全导致。

再补充一个模糊查询的知识点,平时留意一下。


对于要模糊查询的字段,我这里有两种处理方法:
第一种:在组装查询参数的时候,处理,如果参数是存在map中,那么处理方式是map.put("title","%"+dto.getTitle().trim()+"%"),相当于title参数直接带有模糊字符,xml中title LIKE #{title}就行。
第二种:在组装查询参数时,不做处理,在xml中处理,在xml中有两种写法,分别是下面的两种,经过实验,这两种都是可行的,第二种写法显得比较规范,使用了mysql的函数concat(a,b)。

(一):

1 <if test="maiDepartmentName != null">
2         AND maiDepartmentName LIKE '%' #{maiDepartmentName} '%'
3 </if>

 

(二):

1 <if test="title != null">
2     AND  title LIKE CONCAT(CONCAT('%',#{title}),'%')
3 </if>

 

以上内容都是本人在工作的总结,难免会有错误,大家发现欢迎指正!

 

posted @ 2017-03-23 15:58  heyLuer  阅读(35332)  评论(1编辑  收藏  举报