精华内容
下载资源
问答
  • 3.map传参
    千次阅读
    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传参,也麻请配备完备的测试用例吧,省得让后来接手维护的人天天看着代码怀疑人生了。 通过测试用例,后来接手维护的人也能快速搞清代码间的参数传递和调用,不然真的只能...

    image


    还记得上次我写过一篇关于实际项目代码分层和规划的文章《看完这篇,别人的开源项目结构应该能看懂了》
    在文尾处提到过一些注意事项,其中第一条就是:

    • Contorller层参数传递建议不要使用HashMap,推荐使用数据模型定义

    私信里竟然有很多小伙伴提问说,为什么不能这样做?

    我心里暗自寻思:难道这么做的小伙伴都没有被同事捶吗?(滑稽)

    得嘞,今天咱们就掰扯掰扯这件事,这是实际写代码时常忽略的一个问题


    是不是有人也这么写过?

    我自己曾经接手过一个前人留下来的老项目,拿到代码,导入IDEA的那一刻,我哭出了声。

    image

    因为它的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一时爽,维护爽歪歪

    正好,这地方有一个咱小伙伴活生生的例子。

    记得之前有个小伙伴提问,问过一个这样的问题,说他接手了一个别人的老项目,问了我一个类似这样的问题:

    image

    看到没!

    Map传参的第一个(也是最大的一个)弊端就是:这会导致后续接手和维护的人怀疑自己的人生,因为他根本不知道代码传的啥参数,想要构造参数去调试接口只能靠脑补摸瞎、以及猜测了。

    试想一下,其实我们代码里任何一个地方的传参都可以使用Map来传,如果真的这么做了,代码中连任何数据模型类都不需要定义了,果真如此的话,这样的代码咱能看懂吗?

    而且这位小伙伴接手的项目居然还用的是LinkedHashMap参数,可以说很秀了。

    image

    除此之外,紧接着还会带来下面这个问题。


    好用的API工具与你无缘了

    我之前写过一篇文章《前后端都分离了,该搞个好用的API管理系统了!》,聊过现在市面上一些比较好用的、能极大提升前后端开发效率的API管理工具,这对于前后端开发来说,简直是莫大的福音。

    我们就以Swagger这个API工具为例,如果Controller传参使用Map的话:

    // 获取App首页内容
    @ApiOperation("获取App首页内容")
    @PostMapping("/getIndexContent")
    public ResponseWrapper getIndexContent( @RequestBody Map<String, Object> paramMap ) {
    
        // ...... 此处省略
    
    }
    

    API工具无法读取具体参数项目和参数类型,所以传参什么的也看不出来:

    image

    换言之,我如果将上面的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工具就非常方便地能帮助我们管理参数了:

    image

    这样不管是自己调试,还是前、后端对接口都会方便得多。


    同理,除了Swagger这种API管理工具之外,像在我的前文《没用过这些IDEA插件?怪不得写代码头疼》中推荐过的一个非常好用的接口管理插件RestfulToolkit也无法识别出Map类型所盛放的具体参数:

    image

    但是对于数据模型的定义参数,就能非常清晰的给出参数细节,并方便地提供接口测试:

    image


    优秀的注解没法使用了

    还是以文章开头举例的代码来说,不管怎么样,写这段代码的哥们还是负责的,毕竟兢兢业业地用手工连环if()判断完成了所有参数的有效性校验:

    image

    但问题是,我们真的需要这种辣眼睛的手工连环if()判断来做参数校验吗?

    image

    同样在前文《啥?听说你还在手写复杂的参数校验?》中也说过了,我们其实可以通过注解来方便地规避繁杂的参数校验工作,但前提是不能使用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传参的好处就是可以随意扩展,后期变动灵活,想往里面塞几个参数就塞几个参数;而且也省去了各种对象定义和命名的烦恼。

    image


    如果非要用Map传参

    如果实在不能避免用Map传参,也麻请配备完备的测试用例吧,省得让后来接手维护的人天天看着代码怀疑人生了。

    通过测试用例,后来接手维护的人也能快速搞清代码间的参数传递和调用,不然真的只能靠脑补画面去调试了。


    嘘…

    好了,说了这么多,如果你项目的Controller层代码还在使用Map传参的话,答应我,二话别说,赶快全部偷偷去改掉,快!速度!跑步前进!

    image

    展开全文
  • 使用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();
      }
      
    • 测试结果
      请添加图片描述

    展开全文
  • //使用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:19
    Map传参的坑 用 map传参是真的坑爹 ,维护困难等。 1.用map传参做分页 1.我试了分页插件,结果不行最终只能用sql语句来分页了。 注:SQL语句写分页 要是接收前台map传参数的话分页就要这样写 用${} 而不是#{} <!-...
  • 【Mybatis】Map传参和模糊查询

    千次阅读 2022-03-24 11:31:12
    1. 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 接收不到值的解决方案 postForObject方法源码解析.md结论post方法中如果使用map传参,需要使用MultiValueMap来传递RestTemplate 的 postForObject 方法有四个参数String...
  • mysql数据库 map传参

    2021-03-17 10:21:57
    mysql数据库 map传参 Map<String, Object> map2 = new HashMap<>(); map2.put("schoolId", appLogin.getSchoolId()); map2.put("userType", "2"); SysAppLogin login = loginService.selectByDeptId...
  • 别用 Map 传参了,可能一不小心就被自己挖的坑给埋了。
  • 实体传参 //在SQL中加入以下内容 <selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id"> SELECT 序列名.NEXTVAL as id from DUAL </selectKey> //实例如: <insert id=...
  • 示例如下: 此时Mybatis的写法为: <if test="businessName != null and businessName.size>0"> and e.fname in ...foreach collection="businessName" item="oneItem" separator="," ... #{one
  • import com.alibaba.fastjson.TypeReference; ... import java.util.Map; Map<String,Object> map = JSONObject.parseObject(jsonstr, new TypeReference<Map<String, Object>>(){});
  • xml中配置,用delect标签: <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> map传参: 基本传参:#{}中直接就是参数的名字。 对象传参:传入的是个对象,#{}中就是...
  • mapper Map传参失败

    2020-04-26 15:21:17
    map使用map传参的时候,遇到执行错误,map取不到值,贴图如下 经确认 一、参数值要对应,第一处问题是limit没有传 二、类型要对应,并且要声明,修改后如下 ...
  • mybatis之map传参(List和对象)

    千次阅读 2018-02-26 10:26:24
    map传参在我们实际开发会经常用到,也是一种特别方便的传参方式。 话不多说上代码 service层:、 Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;(); List&lt;...
  • 开发中为了方便有人会使用map传参和接受参数,用map的话有好有不好。 dao层或者service层写法如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/e629f64c44444de6824b1d8ca522a993.jpg#pic_center) ...
  • Mybatis框架之map传参

    千次阅读 2016-09-06 16:36:37
    之前写项目的时候就会遇到一次传好多的值,如果封装成一个实体(或者Model)的话还好,但是总会有都不满足的情况,这个时候map传参的话就大大解决了我们这个问题。因为大家都知道map是一对键值对,而且它可以put好多...
  • } 一:当所传参数为map时如何添加参数说明 1:需要不显示param为参数时可以使用@ApiIgnore注解,如图效果 2:需要对map中的参数进行说明使用@ApiImplicitParams和@ApiImplicitParam两个注解,@ApiImplicitParams结合...
  • <groupId>io.springfox <artifactId>springfox-swagger2 ... public void test(Map,String> params){} 效果是 ![图片说明](https://img-ask.csdn.net/upload/201912/30/1577676901_979644.png)
  • 有个需求需要实现多条件查询,然后mybaits使用map进行参数的...然后去搜了一下,才发现我的map传参有问题 接下来直接上代码吧 //controller层 public Result<?> searchPolice(PageInfo pageInfo, @RequestBody
  • postman 模拟map传参或实体类传参

    千次阅读 2020-03-21 23:14:00
    Map或实体类传参,即json格式传值:
  • HTTP get、post 中请求json与map传参格式

    千次阅读 2018-10-22 12:04:00
    public static String doPost(String url, Map,Object> param) throws HttpHostConnectException,IOException{ //创建HttpClient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); String ...
  • 如图: <p><img alt="" height="142" src="https://img-ask.csdnimg.cn/upload/1616763035666.png" width="372" /></p> 调用setItems()这个方法,括号里面应该填什么参数呢 <p><img alt="" height="282" src=...
  • 由于项目用的是oracle 贴出代码片段 Select fn_seq_format(S_hog_role_profile.nextval, 'HR') as id from dual ...这段写在新增语句之前,不用返回值,新增的主键自动映射到传入的参数Map内,不适用于批量返回主键
  • 使用map传参,解决后台没有前台对应实体的类的情况 本文相关代码:https://github.com/Dr-Water/fast-json-test 开发中有时候会遇到前端在一次请求中需要传多个list集合到后台,后端又没有对应的实体类,或者没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,287
精华内容 18,914
关键字:

map传参

友情链接: extended paper 1.rar