测试例子:
controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错,因此要先对请求中的参数进行预处理
1 packageorg.slsale.test;2
3 importjava.util.Date;4 importjava.util.HashMap;5 importjava.util.List;6 importjava.util.Map;7
8 importjavax.servlet.http.HttpServletRequest;9
10 import net.sf.json.JSONArray;
11 import net.sf.json.JsonConfig;12
13 importorg.slsale.common.JsonDateValueProcessor;14 importorg.slsale.dao.testmapper.TestUser;15 importorg.springframework.beans.factory.annotation.Autowired;16 importorg.springframework.stereotype.Controller;17 importorg.springframework.web.bind.annotation.RequestMapping;18 importorg.springframework.web.bind.annotation.RequestMethod;19 importorg.springframework.web.bind.annotation.RequestParam;20 importorg.springframework.web.bind.annotation.ResponseBody;21
22 @Controller23 @RequestMapping("/test")24 public classTestController {25
26 @Autowired27 privateTestService service;28
29 //返回页面的数据中有中文,用produces 处理乱码
30 @RequestMapping(value = "/getUsers", produces = { "text/html;charset=UTF-8" }, method =RequestMethod.GET)31 @ResponseBody32 publicString getUsers(HttpServletRequest request,33 @RequestParam Mapparams1) {34
35 Map params = new HashMap();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 users = service.getUsers(params);42 JsonConfig jsonConfig = newJsonConfig();43 //返回到前端的json数据中,User类里面有Date类型的数据,使用JsonConfig进行时间格式转换
44 jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
45 JSONArray array = JSONArray.fromObject(users, jsonConfig);46 returnarray.toString();47 }48
49 }
自定义 JsonDateValueProcessor,对返回前端的json数据中的时间进行指定时间格式的转换,这里使用net.sf.json的JsonConfig类,要添加 json-lib-2.4-jdk15.jar 这个jar包
1 packageorg.slsale.common;2
3 importjava.text.SimpleDateFormat;4 importjava.util.Date;5 importjava.util.Locale;6
7 importnet.sf.json.JsonConfig;8 importnet.sf.json.processors.JsonValueProcessor;9
10 /**
11 * JsonDateValueProcessor JSON 日期格式处理(java转化为JSON)12 *13 *@author
14 * @date15 */
16 public class JsonDateValueProcessor implementsJsonValueProcessor {17
18
19 private String datePattern = "yyyy-MM-dd";20
21
22 publicJsonDateValueProcessor() {23 super();24 }25
26
27 publicJsonDateValueProcessor(String format) {28 super();29 this.datePattern =format;30 }31
32
33 publicObject processArrayValue(Object value, JsonConfig jsonConfig) {34 returnprocess(value);35 }36
37
38 publicObject processObjectValue(String key, Object value,JsonConfig jsonConfig) {39 returnprocess(value);40 }41
42
43 privateObject process(Object value) {44 try{45 if (value instanceofDate) {46 SimpleDateFormat sdf = newSimpleDateFormat(datePattern,Locale.US);47 returnsdf.format((Date) value);48 }49 return value == null ? "": value.toString();50 } catch(Exception e) {51 return "";52 }53
54 }55
56 publicString getDatePattern() {57 returndatePattern;58 }59
60
61 public voidsetDatePattern(String pDatePattern) {62 datePattern =pDatePattern;63 }64
65 }
2.service层
1 packageorg.slsale.test;2
3 importjava.util.List;4 importjava.util.Map;5
6 importorg.slsale.dao.testmapper.TestUser;7 importorg.slsale.dao.testmapper.TestUserMapper;8 importorg.springframework.beans.factory.annotation.Autowired;9 importorg.springframework.stereotype.Service;10
11 @Service12 public classTestService {13
14 @Autowired15 privateTestUserMapper mapper ;16
17 public List getUsers(Mapparams){18 returnmapper.getUserList1(params);19 }20
21 }
3.dao层,使用map做入参,在sqlMapper.xml中,查询的预编译参数名就是map的key,实际传递进去的查询参数值就是map的value,返回list
1 packageorg.slsale.dao.testmapper;2
3 importjava.util.List;4 importjava.util.Map;5
6
7 public interfaceTestUserMapper {8
9 public List getUserList1(Map map);10
11 }
sql映射mapper xml:
1 <?xml version="1.0" encoding="UTF-8"?>
2 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
5
6
7
8
9 select u.userName ,u.loginCode,u.createTime,r.roleName10 from au_user u11 left join au_role r on r.id=u.roleId12
13 and u.userName like CONCAT('%', #{userName},'%')
14 and u.isStart=#{isStart}
15 and u.userType=#{userType}
16
17 order by createTime desc limit #{startNum},#{pageSize}18
19
20
21
22
23
24
25
26
27
28
联表查询,如果表名使用了别名,接收结果集必须 使用resultmap,resultmap中的column 是sql语句中的查询字段或者该查询字段的别名。sql中的参数名称就是controller中定义的入参map的key
User 类属性:
privateInteger id;privateString userName;privateString loginCode;privateString 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, 会员
浏览器调试界面如下:
代码结构: