測試例子:
controllel層 ,使用map接收請求參數,通過Debug可以看到,請求中的參數的值都是字符串形式,如果將這個接收參數的map直接傳入service,mybatis接收參數時會報錯,因此要先對請求中的參數進行預處理
1 package org.slsale.test; 2 3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.servlet.http.HttpServletRequest; 9 10 import net.sf.json.JSONArray; 11 import net.sf.json.JsonConfig; 12 13 import org.slsale.common.JsonDateValueProcessor; 14 import org.slsale.dao.testmapper.TestUser;15 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.stereotype.Controller; 17 import org.springframework.web.bind.annotation.RequestMapping; 18 import org.springframework.web.bind.annotation.RequestMethod; 19 import org.springframework.web.bind.annotation.RequestParam; 20 import org.springframework.web.bind.annotation.ResponseBody; 21 22 @Controller 23 @RequestMapping("/test") 24 public class TestController { 25 26 @Autowired 27 private TestService service; 28 29 // 返回頁面的數據中有中文,用produces 處理亂碼 30 @RequestMapping(value = "/getUsers", produces = { "text/html;charset=UTF-8" }, method = RequestMethod.GET) 31 @ResponseBody 32 public String getUsers(HttpServletRequest request, 33 @RequestParam Map<String, String> params1) { 34 35 Map<String, Object> params = new HashMap<String, Object>(); 36 // params1中的value值全部都是字符串,進行轉換 37 params.put("isStart", Integer.valueOf(params1.get("isStart"))); 38 params.put("startNum", Integer.valueOf(params1.get("startNum"))); 39 params.put("pageSize", Integer.valueOf(params1.get("pageSize"))); 40 params.put("userType", params1.get("userType")); //數據庫中userType字段是varchar類型,isStart為int類型 41 List<TestUser> users = service.getUsers(params); 42 JsonConfig jsonConfig = new JsonConfig(); 43 // 返回到前端的json數據中,User類里面有Date類型的數據,使用JsonConfig進行時間格式轉換 44 jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor()); 45 JSONArray array = JSONArray.fromObject(users, jsonConfig); 46 return array.toString(); 47 } 48 49 }
自定義 JsonDateValueProcessor,對返回前端的json數據中的時間進行指定時間格式的轉換,這里使用net.sf.json的JsonConfig類,要添加 json-lib-2.4-jdk15.jar 這個jar包
1 package org.slsale.common; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import java.util.Locale; 6 7 import net.sf.json.JsonConfig; 8 import net.sf.json.processors.JsonValueProcessor; 9 10 /** 11 * JsonDateValueProcessor JSON 日期格式處理(java轉化為JSON) 12 * 13 * @author 14 * @date 15 */ 16 public class JsonDateValueProcessor implements JsonValueProcessor { 17 18 19 private String datePattern = "yyyy-MM-dd"; 20 21 22 public JsonDateValueProcessor() { 23 super(); 24 } 25 26 27 public JsonDateValueProcessor(String format) { 28 super(); 29 this.datePattern = format; 30 } 31 32 33 public Object processArrayValue(Object value, JsonConfig jsonConfig) { 34 return process(value); 35 } 36 37 38 public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) { 39 return process(value); 40 } 41 42 43 private Object process(Object value) { 44 try { 45 if (value instanceof Date) { 46 SimpleDateFormat sdf = new SimpleDateFormat(datePattern,Locale.US); 47 return sdf.format((Date) value); 48 } 49 return value == null ? "" : value.toString(); 50 } catch (Exception e) { 51 return ""; 52 } 53 54 } 55 56 public String getDatePattern() { 57 return datePattern; 58 } 59 60 61 public void setDatePattern(String pDatePattern) { 62 datePattern = pDatePattern; 63 } 64 65 }
2.service層
1 package org.slsale.test; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import org.slsale.dao.testmapper.TestUser; 7 import org.slsale.dao.testmapper.TestUserMapper; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.stereotype.Service; 10 11 @Service 12 public class TestService { 13 14 @Autowired 15 private TestUserMapper mapper ; 16 17 public List<TestUser> getUsers(Map<String, Object> params){ 18 return mapper.getUserList1(params); 19 } 20 21 }
3.dao層,使用map做入參,在sqlMapper.xml中,查詢的預編譯參數名就是map的key,實際傳遞進去的查詢參數值就是map的value,返回list
1 package org.slsale.dao.testmapper; 2 3 import java.util.List; 4 import java.util.Map; 5 6 7 public interface TestUserMapper { 8 9 public List<TestUser> getUserList1(Map<String, Object> map); 10 11 }
sql映射mapper xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5 <mapper namespace="org.slsale.dao.testmapper.TestUserMapper"> 6 7 <!-- getUserList1 根據條件查詢分頁用戶列表,聯表查詢,表名使用了別名,需要使用ResultMap進行字段映射而不再是 resultType="user"--> 8 <select id="getUserList1" resultMap="userResultMap" parameterType="Map"> 9 select u.userName ,u.loginCode,u.createTime,r.roleName 10 from au_user u 11 left join au_role r on r.id=u.roleId 12 <where> 13 <if test="userName!=null"> and u.userName like CONCAT('%', #{userName},'%')</if> 14 <if test="isStart!=null">and u.isStart=#{isStart}</if> 15 <if test="userType!=null">and u.userType=#{userType}</if> 16 </where> 17 order by createTime desc limit #{startNum},#{pageSize} 18 </select> 19 20 <resultMap id="userResultMap" type="org.slsale.dao.testmapper.TestUser"> 21 <id property="id" column="u.id" /> 22 <result property="userName" column="u.userName" /> 23 <result property="loginCode" column="u.loginCode" /> 24 <result property="roleName" column="r.roleName" /> 25 <result property="createTime" column="u.createTime" /> 26 </resultMap> 27 28 </mapper>
聯表查詢,如果表名使用了別名,接收結果集必須 使用resultmap,resultmap中的column 是sql語句中的查詢字段或者該查詢字段的別名。sql中的參數名稱就是controller中定義的入參map的key
User 類屬性:
private Integer id; private String userName; private String loginCode; private String roleName; private Date createTime;
運行項目,在瀏覽器輸入http://localhost:8080/slsys/test/getUsers?isStart=1&userType=1&startNum=0&pageSize=5 ,控制台打印的sql語句如下:
==> Preparing: select u.userName ,u.loginCode,u.createTime,r.roleName from au_user u left join au_role r on r.id=u.roleId WHERE u.isStart=? and u.userType=? order by createTime desc limit ?,? ==> Parameters: 1(Integer), 1(String), 0(Integer), 5(Integer) <== Columns: userName, loginCode, createTime, roleName <== Row: 李明亮, admin1234, 2018-07-07 18:31:43.0, 會員 <== Row: 測試用戶10, tes10, 2018-06-10 23:21:35.0, 會員 <== Row: test08, test08, 2018-04-14 09:46:43.0, 會員 <== Row: test07, test07, 2018-04-09 23:06:21.0, 會員 <== Row: JBIT, JBIT, 2014-04-10 00:00:00.0, 會員
瀏覽器調試界面如下:

代碼結構: