-
2021-01-06 16:45:52
map传参
Map传递参数,直接在SQL中取出key即可
1.在接口方法中,参数直接传递Map
int addUser2(Map<String,Object> map);
2.编写SQL语句的时候,需要传递参数类型,参数类型为map
<!--万能map--> <insert id="addUser2" parameterType="map"> INSERT into user (id, name, psw) VALUES (#{id},#{name},#{psw}) </insert>
3.在使用方法的时候,Map的key为sql中去的值即可,没有顺序要求
@Test public void addUser2(){ SqlSession session = MybatisUtils.getSqlSession(); UserDao mapper = session.getMapper(UserDao.class); Map<String, Object> map = new HashMap<String, Object>(); map.put("id",4); map.put("name","yueyue"); map.put("psw","12345678"); mapper.addUser2(map); session.commit(); session.close(); }
总结:如果参数过多,可以考虑直接使用map实现,如果参数比较少,直接传递参数即可。
更多相关内容 -
谁要是再敢用Map传参,我过去就是一JIO
2020-04-05 11:38:56如果非要用Map传参 如果实在不能避免用Map传参,也麻请配备完备的测试用例吧,省得让后来接手维护的人天天看着代码怀疑人生了。 通过测试用例,后来接手维护的人也能快速搞清代码间的参数传递和调用,不然真的只能...
还记得上次我写过一篇关于实际项目代码分层和规划的文章《看完这篇,别人的开源项目结构应该能看懂了》,
在文尾处提到过一些注意事项,其中第一条就是:- Contorller层参数传递建议不要使用HashMap,推荐使用数据模型定义
私信里竟然有很多小伙伴提问说,为什么不能这样做?
我心里暗自寻思:难道这么做的小伙伴都没有被同事捶吗?(滑稽)
得嘞,今天咱们就掰扯掰扯这件事,这是实际写代码时常忽略的一个问题
是不是有人也这么写过?
我自己曾经接手过一个前人留下来的老项目,拿到代码,导入IDEA的那一刻,我哭出了声。
因为它的
Controller
层代码都是类似这样写的:@RestController @RequestMapping("/index") public class IndexController { // 获取App首页内容 @PostMapping("/getIndexContent") public ResponseWrapper getIndexContent( @RequestBody Map<String, Object> paramMap ) { ResponseWrapper res = new ResponseWrapper(); // 下面开始做传参有效性的校验 if (!paramMap.containsKey("article_id")) { res.setCode(500); res.setMsg("缺少 article_id 信息"); return res; } if (!paramMap.containsKey("page")) { res.setCode(500); res.setMsg("缺少 page 信息"); return res; } if (!paramMap.containsKey("size")) { res.setCode(500); res.setMsg("缺少 size 信息"); return res; } if (!paramMap.containsKey("version")) { res.setCode(500); res.setMsg("缺少 version 信息"); return res; } // ...... 此处省略 } // ...... 此处省略 }
别的咱先不说,居然明目张胆地在
Controller
层里方法里用Map
传参?!简直丧心病狂了。幸亏下面还有一波传参有效性的验证,对于传递的参数,我好歹也能猜个大概,不然那真是喵了个咪了。接下来,我们就好好唠一唠:为什么不要在
Controller
层传参时使用Map
类型!
Map一时爽,维护爽歪歪
正好,这地方有一个咱小伙伴活生生的例子。
记得之前有个小伙伴提问,问过一个这样的问题,说他接手了一个别人的老项目,问了我一个类似这样的问题:
看到没!
用
Map
传参的第一个(也是最大的一个)弊端就是:这会导致后续接手和维护的人怀疑自己的人生,因为他根本不知道代码传的啥参数,想要构造参数去调试接口只能靠脑补、摸瞎、以及猜测了。试想一下,其实我们代码里任何一个地方的传参都可以使用
Map
来传,如果真的这么做了,代码中连任何数据模型类都不需要定义了,果真如此的话,这样的代码咱能看懂吗?而且这位小伙伴接手的项目居然还用的是
LinkedHashMap
参数,可以说很秀了。除此之外,紧接着还会带来下面这个问题。
好用的API工具与你无缘了
我之前写过一篇文章《前后端都分离了,该搞个好用的API管理系统了!》,聊过现在市面上一些比较好用的、能极大提升前后端开发效率的API管理工具,这对于前后端开发来说,简直是莫大的福音。
我们就以
Swagger
这个API工具为例,如果Controller
传参使用Map
的话:// 获取App首页内容 @ApiOperation("获取App首页内容") @PostMapping("/getIndexContent") public ResponseWrapper getIndexContent( @RequestBody Map<String, Object> paramMap ) { // ...... 此处省略 }
则
API
工具无法读取具体参数项目和参数类型,所以传参什么的也看不出来:换言之,我如果将上面的
Map
传参改为自定义数据模型类IndexQueryDto
来传参的话:// 获取App首页内容 @ApiOperation("获取App首页内容(改造后)") @PostMapping("/getIndexContent") public ResponseWrapper getIndexContent( @RequestBody IndexQueryDto indexQueryDto ) { // ...... 此处省略 }
@ApiModel(value = "App首页内容请求参数实体对象") class IndexQueryDto { @ApiModelProperty(value = "文章ID号") @NotNull(message = "缺少 article_id 信息") private Long article_id; @ApiModelProperty(value = "页面数") @NotNull(message = "缺少 page 信息") private Integer page; @ApiModelProperty(value = "每页条目数") @NotNull(message = "缺少 size 信息") private Integer size; @ApiModelProperty(value = "App版本号") @NotNull(message = "缺少 version 信息") private String version; // ...... 此处省略set/get方法 }
则类似
Swagger
这种API
工具就非常方便地能帮助我们管理参数了:这样不管是自己调试,还是前、后端对接口都会方便得多。
同理,除了
Swagger
这种API
管理工具之外,像在我的前文《没用过这些IDEA插件?怪不得写代码头疼》中推荐过的一个非常好用的接口管理插件RestfulToolkit
也无法识别出Map
类型所盛放的具体参数:但是对于数据模型的定义参数,就能非常清晰的给出参数细节,并方便地提供接口测试:
优秀的注解没法使用了
还是以文章开头举例的代码来说,不管怎么样,写这段代码的哥们还是负责的,毕竟兢兢业业地用手工连环
if()
判断完成了所有参数的有效性校验:但问题是,我们真的需要这种辣眼睛的手工连环
if()
判断来做参数校验吗?同样在前文《啥?听说你还在手写复杂的参数校验?》中也说过了,我们其实可以通过注解来方便地规避繁杂的参数校验工作,但前提是不能使用
Map
类型传参,需要使用数据模型的定义,就像这样:class IndexQueryDto { @NotNull(message = "缺少 article_id 信息") private Long article_id; @NotNull(message = "缺少 page 信息") private Integer page; @NotNull(message = "缺少 size 信息") private Integer size; @NotNull(message = "缺少 version 信息") private String version; // ...... 此处省略get/set方法 }
一个
NotNull
注解即可搞定,它不香吗?
Map传参真的一无是处吗?
有些小伙伴表示用
Map
传参的好处就是可以随意扩展,后期变动灵活,想往里面塞几个参数就塞几个参数;而且也省去了各种对象定义和命名的烦恼。
如果非要用Map传参
如果实在不能避免用
Map
传参,也麻请配备完备的测试用例吧,省得让后来接手维护的人天天看着代码怀疑人生了。通过测试用例,后来接手维护的人也能快速搞清代码间的参数传递和调用,不然真的只能靠脑补画面去调试了。
嘘…
好了,说了这么多,如果你项目的
Controller
层代码还在使用Map
传参的话,答应我,二话别说,赶快全部偷偷去改掉,快!速度!跑步前进! -
【MyBatis】04 - MyBatis 使用Map传参
2021-07-29 22:10:14使用map传参,直接在sql中使用map的key即可取出参数。 使用对象传参,直接在sql中使用对象的属性名即可取出参数。 使用Map传递参数,实现添加用户 在UserDao/UserMapper中添加一个抽象方法 //添加用户 map方法 ...使用Map传递参数
- 如果数据库中字段很多,实体类中的参数也很多,那么使用实体类对象来传参就不是很方便了,此时可以考虑使用Map!
- 使用map传参,直接在sql中使用map的key即可取出参数。
- 使用对象传参,直接在sql中使用对象的属性名即可取出参数。
使用Map传递参数,实现添加用户
-
在UserDao/UserMapper中添加一个抽象方法
//添加用户 map方法 int addUser2(Map<String, Object> map);
-
在UserMapper.xml中实现这个抽象方法
<!-- 新增用户 Map方法 --> <insert id="addUser2" parameterType="map"> insert into mybatis.user (`name`,`pwd`) values (#{username},#{password}) </insert>
-
测试
@Test public void addUser2(){ SqlSession sqlSession = MybatisUtils.getSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<>(); map.put("username","张三"); map.put("password","123123"); int i = mapper.addUser2(map); if(i > 0){ System.out.println("成功插入"+ i + "个用户!"); }else { System.out.println("插入失败"); } sqlSession.commit(); sqlSession.close(); }
-
测试结果
使用Map传递参数,实现查询用户 -
在UserDao/UserMapper中添加一个抽象方法
//根据id查用户 Map方法 User getUserById2(Map<String, Object> map);
-
在UserMapper.xml中实现这个抽象方法
<select id="getUserById2" parameterType="map" resultType="com.nych.entity.User"> select * from `user` where id = #{userId} and `name` = #{userName} </select>
-
测试
//测试 使用Map传参 @Test public void getUserById2(){ SqlSession sqlSession = MybatisUtils.getSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<>(); map.put("userId",6); map.put("userName","map"); User user = mapper.getUserById2(map); System.out.println("user = " + user); sqlSession.commit(); sqlSession.close(); }
-
测试结果
-
Mybatis查询方法使用map传参
2021-09-11 15:14:54//使用map传递参数 User getUserById2(Map<String,Object> map); xml文件实现 <select id="getUserById2" parameterType="map" resultType="com.kuang.pojo.User"> select * from mybatis.user ...接口方法
//使用map传递参数 User getUserById2(Map<String,Object> map);
xml文件实现
<select id="getUserById2" parameterType="map" resultType="com.kuang.pojo.User"> select * from mybatis.user where id=#{helloid} and name = #{helloname} </select>
测试方法
//使用map传递参数 @Test public void getUserById2(){ SqlSession sqlSession = MybatisUtils.getSqlSission(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String,Object> map = new HashMap<>(); map.put("helloid",2); map.put("helloname","张亚龙"); User userById2 = mapper.getUserById2(map); System.out.println(userById2); sqlSession.close(); }
好处:可以随便定义传递参数的名字。
-
Map传参的坑
2020-05-23 11:17:19Map传参的坑 用 map传参是真的坑爹 ,维护困难等。 1.用map传参做分页 1.我试了分页插件,结果不行最终只能用sql语句来分页了。 注:SQL语句写分页 要是接收前台map传参数的话分页就要这样写 用${} 而不是#{} <!-... -
【Mybatis】Map传参和模糊查询
2022-03-24 11:31:121. map传参 1.1 insert (1)在UserMapper.java文件中添加: // insert map int addUserMap(Map<String, Object> map); (2)在UserMaooer.xml文件中添加: <insert id="addUserMap" parameterType="map"&... -
在Mybatis中使用万能的Map传参,实现增删改查
2021-07-20 23:39:11在编程中,有可能遇到我们的实体类或者数据库中表的字段或参数过多的情况,那这时候用Map传参是比较理想的选择。 Map的特性是键值对应的,只要确定了一个键key,那么值value可以是任何的数据,这样就可以在map内存... -
RestTemplate post请求使用map传参 Controller 接收不到值的解决-站长资讯中心
2021-07-20 03:01:59RestTemplate post请求使用map传参 Controller 接收不到值的解决方案 postForObject方法源码解析.md结论post方法中如果使用map传参,需要使用MultiValueMap来传递RestTemplate 的 postForObject 方法有四个参数String... -
mysql数据库 map传参
2021-03-17 10:21:57mysql数据库 map传参 Map<String, Object> map2 = new HashMap<>(); map2.put("schoolId", appLogin.getSchoolId()); map2.put("userType", "2"); SysAppLogin login = loginService.selectByDeptId... -
谁再用 Map 传参,上去就给他一jio,别客气
2021-12-08 13:55:28别用 Map 传参了,可能一不小心就被自己挖的坑给埋了。 -
MyBatis返回自增主键:实体传参或Map传参
2021-01-19 13:52:50实体传参 //在SQL中加入以下内容 <selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id"> SELECT 序列名.NEXTVAL as id from DUAL </selectKey> //实例如: <insert id=... -
Mybatis利用Map传参里面含有List对象
2021-06-03 11:19:18示例如下: 此时Mybatis的写法为: <if test="businessName != null and businessName.size>0"> and e.fname in ...foreach collection="businessName" item="oneItem" separator="," ... #{one -
alibaba.fastjson json字符串转map传参
2021-04-30 20:27:25import com.alibaba.fastjson.TypeReference; ... import java.util.Map; Map<String,Object> map = JSONObject.parseObject(jsonstr, new TypeReference<Map<String, Object>>(){}); -
Mybatis之增删改查实现(对比分析对象传参和map传参)
2020-12-14 13:08:00xml中配置,用delect标签: <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> map传参: 基本传参:#{}中直接就是参数的名字。 对象传参:传入的是个对象,#{}中就是... -
mapper Map传参失败
2020-04-26 15:21:17map使用map传参的时候,遇到执行错误,map取不到值,贴图如下 经确认 一、参数值要对应,第一处问题是limit没有传 二、类型要对应,并且要声明,修改后如下 ... -
mybatis之map传参(List和对象)
2018-02-26 10:26:24map传参在我们实际开发会经常用到,也是一种特别方便的传参方式。 话不多说上代码 service层:、 Map<String, Object> params = new HashMap<String, Object>(); List<... -
关于mybaits中使用map传参和返回参数的优缺点
2021-11-05 23:23:52开发中为了方便有人会使用map传参和接受参数,用map的话有好有不好。 dao层或者service层写法如下:  ... -
Mybatis框架之map传参
2016-09-06 16:36:37之前写项目的时候就会遇到一次传好多的值,如果封装成一个实体(或者Model)的话还好,但是总会有都不满足的情况,这个时候map传参的话就大大解决了我们这个问题。因为大家都知道map是一对键值对,而且它可以put好多... -
swagger使用map传参和实体传参编写注释
2020-04-16 11:59:44} 一:当所传参数为map时如何添加参数说明 1:需要不显示param为参数时可以使用@ApiIgnore注解,如图效果 2:需要对map中的参数进行说明使用@ApiImplicitParams和@ApiImplicitParam两个注解,@ApiImplicitParams结合... -
spring boot swagger2怎么进行map传参
2019-12-30 11:35:50<groupId>io.springfox <artifactId>springfox-swagger2 ... public void test(Map,String> params){} 效果是  -
mybaits用使用map传参,实现多条件查询
2020-07-31 17:19:46有个需求需要实现多条件查询,然后mybaits使用map进行参数的...然后去搜了一下,才发现我的map传参有问题 接下来直接上代码吧 //controller层 public Result<?> searchPolice(PageInfo pageInfo, @RequestBody -
postman 模拟map传参或实体类传参
2020-03-21 23:14:00Map或实体类传参,即json格式传值: -
HTTP get、post 中请求json与map传参格式
2018-10-22 12:04:00public static String doPost(String url, Map,Object> param) throws HttpHostConnectException,IOException{ //创建HttpClient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); String ... -
关于Map传参的问题,求大佬们指导一下
2021-03-26 20:51:53如图: <p><img alt="" height="142" src="https://img-ask.csdnimg.cn/upload/1616763035666.png" width="372" /></p> 调用setItems()这个方法,括号里面应该填什么参数呢 <p><img alt="" height="282" src=... -
mybatis 新增主键返回sql (Map传参)
2018-02-11 10:18:43由于项目用的是oracle 贴出代码片段 Select fn_seq_format(S_hog_role_profile.nextval, 'HR') as id from dual ...这段写在新增语句之前,不用返回值,新增的主键自动映射到传入的参数Map内,不适用于批量返回主键 -
使用map传参,解决后台没有前台对应实体的类的情况
2019-09-18 11:18:27使用map传参,解决后台没有前台对应实体的类的情况 本文相关代码:https://github.com/Dr-Water/fast-json-test 开发中有时候会遇到前端在一次请求中需要传多个list集合到后台,后端又没有对应的实体类,或者没有...