zoukankan      html  css  js  c++  java
  • 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, 会员
    浏览器调试界面如下:

    代码结构:

  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/9250429.html
Copyright © 2011-2022 走看看