不知道你有沒有遇到這種情況,在一個的數據列表中,我們需要對某些數據按條件進行檢索,你是否在服務器端裏面都要獲取條件,並且判斷第一個條件是否爲空,如果不爲空則繼續判斷第二個條件用戶有沒有選擇,不爲空則再繼續判斷第三個條件是否爲空,爲空則要寫第三個條件的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處理,就能直接避免文章第一段所講的情況。