测试例子:

controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错,因此要先对请求中的参数进行预处理

 package org.slsale.test;

 import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; 10 import net.sf.json.JSONArray;
11 import net.sf.json.JsonConfig;

import org.slsale.common.JsonDateValueProcessor;
import org.slsale.dao.testmapper.TestUser; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/test")
public class TestController { @Autowired
private TestService service; // 返回页面的数据中有中文,用produces 处理乱码
@RequestMapping(value = "/getUsers", produces = { "text/html;charset=UTF-8" }, method = RequestMethod.GET)
@ResponseBody
public String getUsers(HttpServletRequest request,
@RequestParam Map<String, String> params1) { Map<String, Object> params = new HashMap<String, Object>();
// params1中的value值全部都是字符串,进行转换
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类型
List<TestUser> users = service.getUsers(params);
JsonConfig jsonConfig = new JsonConfig();
// 返回到前端的json数据中,User类里面有Date类型的数据,使用JsonConfig进行时间格式转换
jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
45 JSONArray array = JSONArray.fromObject(users, jsonConfig);
return array.toString();
} }
自定义 JsonDateValueProcessor,对返回前端的json数据中的时间进行指定时间格式的转换,这里使用net.sf.json的JsonConfig类,要添加 json-lib-2.4-jdk15.jar 这个jar包
 package org.slsale.common;

 import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale; import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor; /**
* JsonDateValueProcessor JSON 日期格式处理(java转化为JSON)
*
* @author
* @date
*/
public class JsonDateValueProcessor implements JsonValueProcessor { private String datePattern = "yyyy-MM-dd"; public JsonDateValueProcessor() {
super();
} public JsonDateValueProcessor(String format) {
super();
this.datePattern = format;
} public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
} public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {
return process(value);
} private Object process(Object value) {
try {
if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat(datePattern,Locale.US);
return sdf.format((Date) value);
}
return value == null ? "" : value.toString();
} catch (Exception e) {
return "";
} } public String getDatePattern() {
return datePattern;
} public void setDatePattern(String pDatePattern) {
datePattern = pDatePattern;
} }

2.service层

 package org.slsale.test;

 import java.util.List;
import java.util.Map; import org.slsale.dao.testmapper.TestUser;
import org.slsale.dao.testmapper.TestUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class TestService { @Autowired
private TestUserMapper mapper ; public List<TestUser> getUsers(Map<String, Object> params){
return mapper.getUserList1(params);
} }

3.dao层,使用map做入参,在sqlMapper.xml中,查询的预编译参数名就是map的key,实际传递进去的查询参数值就是map的value,返回list

 package org.slsale.dao.testmapper;

 import java.util.List;
import java.util.Map; public interface TestUserMapper { public List<TestUser> getUserList1(Map<String, Object> map);

}

sql映射mapper xml:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.slsale.dao.testmapper.TestUserMapper"> <!-- getUserList1 根据条件查询分页用户列表,联表查询,表名使用了别名,需要使用ResultMap进行字段映射而不再是 resultType="user"-->
<select id="getUserList1" resultMap="userResultMap" parameterType="Map">
select u.userName ,u.loginCode,u.createTime,r.roleName
from au_user u
left join au_role r on r.id=u.roleId
<where>
<if test="userName!=null"> and u.userName like CONCAT('%', #{userName},'%')</if>
<if test="isStart!=null">and u.isStart=#{isStart}</if>
<if test="userType!=null">and u.userType=#{userType}</if>
</where>
order by createTime desc limit #{startNum},#{pageSize}
</select> <resultMap id="userResultMap" type="org.slsale.dao.testmapper.TestUser">
<id property="id" column="u.id" />
<result property="userName" column="u.userName" />
<result property="loginCode" column="u.loginCode" />
<result property="roleName" column="r.roleName" />
<result property="createTime" column="u.createTime" />
</resultMap> </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. <MyBatis>入门四 传入的参数处理

    1.单个参数 传入单个参数时,mapper文件中 #{}里可以写任意值 /** * 传入单个参数 */ Employee getEmpById(Integer id); <!--单个参数 #{} ...

  2. mybatis 传递多个查询参数

    方法1:顺序传参法 public User selectUser(String name, int deptId); <select id="selectUser" resu ...

  3. 关于用mybatis调用存储过程时的入参和出参的传递方法

    一.问题描述 a)         目前调用读的存储过程的接口定义一般是:void  ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...

  4. SpringBoot2 参数管理实践,入参出参与校验

    一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...

  5. 解决WebApi入参时多对象的问题

    我们的项目是用WebApi提供数据服务,且WebPage跟APP中都有调用到. WebApi提供的接口一多,就发现一个问题,我们项目中有很多接口是接收POST(安全原因,我们采用的是https)请求的 ...

  6. 对称加密——对入参进行DES加密处理

    体验更优排版请移步原文:http://blog.kwin.wang/programming/symmetric-encryption-des-js-java.html 对称加密是最快速.最简单的一种加 ...

  7. MyBatis 中传递多个参数的 4 种方式

    方式 1 :封装成对象入参  #{对应实体类的属性} //UserMapper.java 接口 /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @para ...

  8. mybatis框架之多参数入参--传入Map集合

    需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可 ...

  9. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

随机推荐

  1. CSU 1548 Design road(三分查找)

    题目链接:https://cn.vjudge.net/problem/142542/origin Description You need to design road from (0, 0) to ...

  2. linux-批量修改目录下后缀shell

    #!/bin/bashcd /optrename .sh .shell *.shecho "后缀修改成功"

  3. spring4.1.8扩展实战之八:Import注解

    spring4.1.8扩展实战之八:Import注解 2018年09月10日 12:53:57 博陵精骑 阅读数:441更多 所属专栏: spring4源码分析与实战    版权声明:欢迎转载,请注明 ...

  4. mybatis有结果返回null

    解决:application.yml 中mybatis此项(解决驼峰及数据库字段有下划线问题) map-underscore-to-camel-case: true 问题: mybatis debug ...

  5. ngrinder压力测试

    文章目录 另一篇 部署demo 写脚本 压力测试 目标主机监控 可能报错 总结: 另一篇 https://blog.csdn.net/dataiyangu/article/details/888518 ...

  6. is_numeric漏洞总结

    将16进制数据判断为数据,这样在存入数据库后,数据库会把16进制解析成字符串,可能造成二次注入 转载: https://www.jianshu.com/p/e7cf997d6ccb

  7. tensorflow学习框架(炼数成金网络版学习记录)

    chapter1 #变量 import tensorflow as tf x = tf.Variable([1,2]) a = tf.constant([3,3]) #增加一个减法op sub = t ...

  8. TypeError: 'generator' object is not subscriptable

    TypeError: 'generator' object is not subscriptable 生成器对象不可以带下标 def get_row(self,row_no): if not isin ...

  9. [CodeForces 52C]Circular RMQ

    题目传送门 评分:省选/NOI-,难度:普及+/提高 这题真的和RMQ没有半点关系,只需要一个裸的线段树,连pushdown都不需要,只需要两种操作:区间修改和区间求最小值,在回溯时加上标记即可,唯一 ...

  10. [fw]Linux下tty/pty/pts/ptmx详解

    基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...