springMVC使用map接收入參 + mybatis使用map 傳入查詢參數


 測試例子:

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, 會員
瀏覽器調試界面如下:

代碼結構:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM