由于业务特殊的查询需求,需要下面的这种查询,一直感觉模糊不清,本地测试一下顺便做个总结
贴一段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>
以上内容都是本人在工作的总结,难免会有错误,大家发现欢迎指正!