不知道你有没有遇到这种情况,在一个的数据列表中,我们需要对某些数据按条件进行检索,你是否在服务器端里面都要获取条件,并且判断第一个条件是否为空,如果不为空则继续判断第二个条件用户有没有选择,不为空则再继续判断第三个条件是否为空,为空则要写第三个条件的else代码,而且也要写第一和第二条件为空的else语句。并且为其创建对应的业务接口方法及业务实现类,而且还要写对应的sql语句才能完成操作。想到这里一般心态都要爆炸了吧。如果按照上面那种模式开发,即代码臃肿而且开发和维护麻烦,针对这种情况,就要借助mybatisif条件判断标签帮忙了。
1.准备好前端页面
我这里有一个输入框和两个下拉列表
2.控制器层相应的处理方法
这里的处理思路不建议借鉴
@RequestMapping(value = "/search")
public ModelAndView search(@RequestParam(name = "pageNo",defaultValue = "1") int pageNo,@RequestParam(name = "pageSize",defaultValue = "15") int pageSize
,@RequestParam(name = "name",defaultValue = "") String name,@RequestParam(name = "userClass",defaultValue = "0") Integer userClass,@RequestParam(name = "houseId",defaultValue = "") String houseId){
ModelAndView modelAndView = new ModelAndView();
// System.out.println("name:"+name);
// System.out.println("userClass:"+userClass);
// System.out.println("houseId:"+houseId);
if (name.equals("")&&userClass==0&&houseId.equals("")){
//所有为空不搜索,直接跳转回所有数据
modelAndView.setViewName("redirect:listAll");
return modelAndView;
}else{
//只要有一个条件不为空,都要查找
Page<?> page = PageHelper.startPage(pageNo,pageSize);
List<User> userList = userService.searchByNameUserClassHouseId(name,userClass,houseId);
PageInfo<?> pageInfo = page.toPageInfo();
User user1 = new User();
user1.setName(name);
modelAndView.addObject("user",user1);
modelAndView.addObject("userlist",userList);
modelAndView.addObject("pageHelper",pageInfo);
List<House> houseList = houseBiz.selectAllHouse();
modelAndView.addObject("houseList",houseList);
modelAndView.addObject("hlist", houseBiz.selectAllHouse());
modelAndView.addObject("clist",userClassBiz.selectAll());
modelAndView.setViewName("users_search");
return modelAndView;
}
}
3.业务层的实现类
4.数据库处理层
接口类:
注意这里的方法的形式参数有@Param注解,这个注解是让mybatis知道传过来的数据的名称,这些名称对应映射文件的方法的参数。
映射文件:
if标签里的name等参数都对应着接口注解穿过来的参数名称一致。而且要注意sql语句的写法,我这里有个where 1=1,这个永远为真的条件,为什么要这么做?如果这里的name为空,则一定会跳到判断userClass的,如果这时候userClass不为空,则SQL语句就是select * from users where and user_class = #{userClass},就会报错的,有1=1这个条件,就能避免这个问题。
<select id="selectByNameUserClassHouseId" resultMap="user">
select * from users where 1=1
<if test="name != ''">
and name like concat('%',#{name},'%')
</if>
<if test="userClass != 0">
and user_class = #{userClass}
</if>
<if test="houseId != ''">
and house_id = #{houseId}
</if>
and is_delete = '0'
</select>
把用户提交过来的参数是否为空交给mybatis处理,就能直接避免文章第一段所讲的情况。