首页 > 其他分享 >mybatis 11: 通过map获取入参和返回值

mybatis 11: 通过map获取入参和返回值

时间:2022-08-15 14:25:28浏览次数:113  
标签:11 map 00 01 users 入参 id select

1. 通过指定参数位置获取

作用

  • 如果入参是多个且实体类无法封装所有的入参,可以通过指定参数位置进行传参,方便对多个参数进行获取

用法

接口

    //指定参数位置
    List<User> getByBirthday(Date start, Date  end);

sql标签

    <!--
        //指定参数位置
        List<User> getByBirthday(Date start, Date  end);
    -->

    <select id="getByBirthday" resultType="user">
        select
            <include refid="allColumns"/>
        from
            users
        where
            birthday between #{arg0} and #{arg1}
    </select>
  • 在当前较高版本中,根据参数位置引用参数时,参数名的写法规定为:arg0,arg1....以此类推

测试

   
	//指定参数位置测试
	@Test
    public void testGetByBirthday() throws ParseException {
        List<User> users = usersMapper.getByBirthday(
                date.parse("2001-01-01"),
                date.parse("2002-08-23"));
        users.forEach(System.out::println);
    }

输出

==>  Preparing: select id, username, birthday, sex, address from users where birthday between ? and ?
==> Parameters: 2001-01-01 00:00:00.0(Timestamp), 2002-08-23 00:00:00.0(Timestamp)
<==    Columns: id, username, birthday, sex, address
<==        Row: 1, 荷包蛋, 2002-08-23, 女, 黑河市
<==        Row: 2, 小王, 2001-07-12, 1, 芜湖市
<==        Row: 5, 段, 2001-03-10, 1, 太原
<==        Row: 6, 范成群, 2002-01-19, 1, 鲅鱼圈
<==        Row: 7, 学委, 2001-05-13, 2, 平顶山市
<==        Row: 31, 西决2, 2001-01-01, 男, 北京
<==        Row: 32, 南音2, 2002-02-02, 女, 北京
<==      Total: 7

缺点

  • 用arg0,arg1等来定位参数时,语义不明确

2. 用map来传递入参

作用

  • 既可以确保参数在存取时的语义,又可以简便的存取参数

用法

接口

    //入参类型是map
    List<User> getByMap(Map<Object, Object> map);

sql标签

    <!--
        //入参类型是map
        List<User> getByMap(Map map);
    -->
    <select id="getByMap" resultType="user">
        select
            <include refid="allColumns"/>
        from
            users
        where
            birthday between #{birthdayBegin} and #{birthdayEnd}
    </select>
  • 通过传入的map的key来获取map中的变量值

测试

    @Test
    public void testGetByMap() throws ParseException {
        Date birthdayBegin = date.parse("2001-01-01");
        Date birthdayEnd = date.parse("2002-08-23");
        Map<Object, Object> birthdayMap = new HashMap<>();
        birthdayMap.put("birthdayBegin", birthdayBegin);
        birthdayMap.put("birthdayEnd", birthdayEnd);

        List<User> users = usersMapper.getByMap(birthdayMap);
        users.forEach(System.out::println);
    }

输出

==>  Preparing: select id, username, birthday, sex, address from users where birthday between ? and ?
==> Parameters: 2001-01-01 00:00:00.0(Timestamp), 2002-08-23 00:00:00.0(Timestamp)
<==    Columns: id, username, birthday, sex, address
<==        Row: 1, 荷包蛋, 2002-08-23, 女, 黑河
<==        Row: 2, 小王, 2001-07-12, 1, 芜湖市
<==        Row: 5, 段, 2001-03-10, 1, 太原
<==        Row: 6, 范成群, 2002-01-19, 1, 鲅鱼圈
<==        Row: 7, 学委, 2001-05-13, 2, 平顶山市
<==        Row: 31, 西决2, 2001-01-01, 男, 北京
<==        Row: 32, 南音2, 2002-02-02, 女, 北京
<==      Total: 7

返回值是map

背景

image

  • 当需要从多张表的字段中获取数据时,没有事先写好的实体类来封装查询到的数据,可以用map作为容器来盛放零碎的数据
    • 各个表的字段的组合可能性太多,提前定义实体类不现实也没有必要

用法

接口

    //返回一行map
    Map<Object, Object> getOneMap(Integer id);

    //返回多行map
    List<Map<Object, Object>> getManyMap();

sql标签

    <!--
        //返回一行map
        Map<Object, Object> getOneMap(Integer id);
    -->
    <select id="getOneMap" parameterType="int" resultType="map">
        select
            username, address
        from
            users
        where
            id=#{id}
    </select>


    <!--
        //返回多行map
        List<Map<Object, Object>> getManyMap();
    -->
    <select id="getManyMap" resultType="map">
        select
            username, address
        from
            users
    </select>
  • 对于返回多行map的查询操作,查询到的每条记录都封装到一个map中,当有多个map时,这些map被封装到最外层的list中
    • 这里的每个map都相当于原先查询数据时,每条数据都封装成一个实体类,再把所有实体类封装到list中返回,原理一样

测试

    //返回一行map测试
	@Test
    public void testGetOneMap(){
        Map<Object, Object> map = usersMapper.getOneMap(1);
        System.out.println(map);
    }

	//返回多行测试
    @Test
    public void testGetManyMap(){
        List<Map<Object, Object>> maps = usersMapper.getManyMap();
        maps.forEach(map -> {
            map.forEach((key, val) -> {
                System.out.println(key + " : " + val);
            });
            System.out.println("-----------------------------");
        });
    }

输出

//返回一行map输出

==>  Preparing: select username, address from users where id=?
==> Parameters: 1(Integer)
<==    Columns: username, address
<==        Row: 荷包蛋, 黑河
<==      Total: 1
{address=黑河, username=荷包蛋}


//返回多行map输出

==>  Preparing: select username, address from users
==> Parameters: 
<==    Columns: username, address
<==        Row: 荷包蛋, 黑河
<==        Row: 小王, 芜湖市
<==        Row: 段, 太原
<==        Row: 范成群, 鲅鱼圈
<==        Row: 学委, 平顶山市
<==        Row: 逻辑, 上海
<==        Row: 小青, 沈阳市
<==        Row: 西决2, 北京
<==        Row: 南音2, 北京
<==        Row: 北北2, 北京
<==      Total: 10
address : 黑河
username : 荷包蛋
-----------------------------
address : 芜湖市
username : 小王
-----------------------------
address : 太原
username : 段
-----------------------------
address : 鲅鱼圈
username : 范成群
-----------------------------
address : 平顶山市
username : 学委
-----------------------------
address : 上海
username : 逻辑
-----------------------------
address : 沈阳市
username : 小青
-----------------------------
address : 北京
username : 西决2
-----------------------------
address : 北京
username : 南音2
-----------------------------
address : 北京
username : 北北2
-----------------------------
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@77a98a6a]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@77a98a6a]
Returned connection 2007599722 to pool.

Process finished with exit code 0

标签:11,map,00,01,users,入参,id,select
From: https://www.cnblogs.com/nefu-wangxun/p/16588136.html

相关文章

  • P3272 [SCOI2011]地板
    [SCOI2011]地板LuoguP3272题目描述lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西。小L家的客厅是一个\(r\timesc\)的矩形,现在他想用L型的地板来铺......
  • CSP202112-4 磁盘文件操作
        第一眼,嗯,线段树裸题。开写,交,发现空间炸了,遂离散化。再交,发现在操作0的时候有可能遇到离散化中没出现过的点(即给定数据外的点),因为要二分右端点。怎么办呢?大胆观......
  • com.google.common.collect.Table 双键的Map
    com.google.common.collect.Table存放的数据,以2个键(rowKey+columnKey)一个值的形式,提供了以下方法:cellSet()rowKeySet()columnKeySet()values()以下是以学生课程实例......
  • 【Java】List排序方法(包括对象、Map等内部排序实现)
    前言日常开发中经常会对List集合做排序操作,JDK为我们提供了强大的排序方法,可以针对对象、Map、基本类型等进行正/倒排序操作。参考博客:JAVA列表排序方法sort和reversed......
  • luoguP3521 [POI2011]ROT-Tree Rotations【线段树】
    你要写热,就不能只写热。要写酷暑,写骄阳,写他人耳闻便生恐的炙烤和炎灼。要写白日出门一刻便肤色黝黑,背心透彻。写求雨心切,写出行伞遮。写夜晚不停的风扇和蝉聒。写鸡......
  • 前端处理 input 元素的 files 属性时报错【m.map is not a function】
    问题描述在使用HTML的文件上传元素<inputtype="file">时,处理其返回的files数据时遇到了这个报错m.mapisnotafunction。我的代码如下:constuploadCSVFiles=even......
  • [官方 MVS(MSDN)][Windows 11 CO-21H2] 2022年7月 映像更新 - 22000.795
     简体中文-消费者版(2022年7月更新-22000.795)家庭版、家庭单语言版、教育版、专业版、专业教育版、专业工作站版(6)文件: zh-cn_windows_11_consumer_editions_......
  • HC32L110 系列 M0 MCU 的介绍和Win10下DAP-Link, ST-Link, J-Link的烧录
    HC32L110系列CortexM0MCUHackaday在三月份的时候介绍了一款最小的MCUNEWPARTDAY:SMALLESTARMMCUUPROOTSCOMPETITION,NEEDSRESEARCH,华大的HC32L110B6YA-......
  • [2011年NOIP提高组] 铺地毯
    输入每个地毯的位置大小,用二维数组存储然后输入指定的点枚举出此点所在地毯(四个顶点上的点也算被地毯覆盖)输出地毯编号(若此处没有被地毯覆盖则输出-1)代码:#include<ios......
  • [2011年NOIP提高组] 铺地毯
    [2011年NOIP提高组]铺地毯思路:运用暴力枚举法。开一个结构体存地毯信息,然后铺上地毯。然后在根据要找的地点,与输入顺序反着一一枚举来找符合的地毯(因为地毯会覆盖,先铺的......