springMVC使用map接收入参 + mybatis使用map 传入查询参数

摘要:
测试示例:控制器层使用映射来接收请求参数。从Debug中可以看到,请求中的参数值都是字符串形式。如果接收参数的映射直接传输到服务,mybatis将在接收参数时报告错误。因此,您需要首先对请求中的参数1packageorg.slsale进行预处理。测验23导入java.util。日期4导入java.util。HashMap;5导入java.ut

 测试例子:

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, 会员
浏览器调试界面如下:
springMVC使用map接收入参 + mybatis使用map 传入查询参数第1张

代码结构:

springMVC使用map接收入参 + mybatis使用map 传入查询参数第2张

springMVC使用map接收入参 + mybatis使用map 传入查询参数第3张

springMVC使用map接收入参 + mybatis使用map 传入查询参数第4张

免责声明:文章转载自《springMVC使用map接收入参 + mybatis使用map 传入查询参数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nginx反向代理缓冲区优化Sublime Text3注册激活和部分配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jQuery之前端国际化jQuery.i18n.properties

jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。 国际化英文单词为:Internationalization,又称i18n,“i”为单词的第一个字母,“18”为“i”和“n”之间单词的个数,而“n”代表这个单词的最后一个字母。jQuery.i18n.properties采用.properties文...

asp.net mvc+EF 递归生成树结构返回json

0、数据表结构,主要属性有:Id、parentId(父节Id)、Text、Url……等等。 1、新建一个树结构MenuModels 1 public class MenuModels 2 { 3 private int _id; 4 private string _text; 5...

asp.net关键字模糊查询(类似于各大网站搜索功能)

  今天与大家分享一个小算法,我是用C#写的,其他语言也一样换下语法就行了。以空格断开关键字模糊查询,类似于各大网站的搜索功能。我想的就是一个拼接sql语句的过程。都是以空格断开关键字,分两种情况,一种是以空格断开是”且”的关系,另一种是以空格断开是”或”的关系。其实也很简单,直接上代码吧。   关键字"或"的关系代码: /// <summary&g...

Oracle中对列加密的方法

Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col(id int,txt varchar2(100) encrypt using '算法名称' identified by '密钥' no salt);优...

【Android】Android中线程的应用

1. Android进程    在了解Android线程之前得先了解一下Android的进程。当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足...

java字符串与基础混淆

java字符串是一个类,是java虚拟机在启动的时候会实例化9个对象池,其中9个对象池分别用来存储8种基本数据类型(int,float,double,byte,boolean,short,long,char)的包装类和String对象。 Java String创建对象有两种方式,其中一种是通过直接创建:String str1="Stringhello",另...