MyBatis学习笔记——查询返回值为HashMap、鉴别器的运用

本文介绍了在MyBatis中如何查询返回HashMap,包括查询一条数据和多条数据时的处理方式,强调了HashMap作为返回类型时的注意事项。此外,还详细讲解了鉴别器(discriminator)的运用,用于根据查询结果进行分支处理,举例说明了如何根据班级字段区分使用真名或昵称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询返回HashMap介绍
  • 介绍:有时候就想通过HashMap返回sql查询的值,然后最近也终于学到了设置返回类型为HashMap类型,如何建立sql语句以及接口方法的书写问题;不过目前觉得一般吧;
查询一条数据
1.sql语句编写样式
	<!--传入stuNo获取学生信息-->
	<select id="queryStudentByHashMap"   parameterType="int"
            resultType="HashMap">
         select stuNo ,stuName ,stuAge 
        from student  where stuNo = #{stuNo}
    </select>
2.接口编写格式
HashMap<String,Object> queryStudentByHashMap(int stuNo);

然后就可以通过调用方法接口获得相应的信息了;

  • 但是,有时候想查询多条数据,使用该方法就不行了,为啥?

  • 一个很明显的逻辑原因就是HashMap中的K是唯一的,以上方式是将 stuNo ,stuName ,stuAge 作为KEY,而相应的值作为value;

  • 而MyBatis也考虑到了返回值是HashMap,而需要返回接收多个数据的问题,主要是通过pojo类以及@MapKey("")指定,以下是HashMap多值接收:

查询多条数据
1.sql语句编写样式
	<!--查询多条数据-->
    <select id="queryStudentsByHashMap"
            resultType="HashMap">
         select stuNo ,stuName ,stuAge  from student
    </select>
2.接口编写格式
	//获取多值
	@MapKey("stuNo")
	HashMap<Integer,Student> queryStudentsByHashMap();

这样就行了,不过注意的是,调用接口该方法的时候,要注意接收的一方也要是<Integer,Student> ,如果是<String,Object>的话接收不了;如果stuNo是字符串,则是<String,Student>;
建议就是stuNo是主键或则唯一约束,不然会出现覆盖掉的情况;

嗯~,这样其实用类包装更好了,然后用List进行接收多个;


鉴别器的运用介绍

鉴别器discriminator的设置是在resultMap里面的,主要是根据查询的结果进行分支处理和if分支语句有点类似;

例如Student中的变量有:stuNo,stuName,stuAge,graName四个;而student表中有sno,sname,sage,gname,nickname;然后设定以gname为判断标准,如果是班级是“a”,则stuName对应真名,如果是“b”,stuName对应昵称;

 <select id="queryStudentsWithResultMap"
            resultMap ="studentResultMap">
         select sno, sname,nickname, sage, gname from student

    </select>

    <resultMap type="com.yanqun.entity.Student" id="studentResultMap">
        <!--主键 -->
        <id  column="sno" property="stuNo"/>
        <!--普通字段
        <result  column="sname" property="stuName"/> -->
        <result  column="sage" property="stuAge"/>

        <!-- 鉴别器  : 对查询结果进行分支处理: 如果是a年级,则真名,如果b年级,显示昵称-->
        <discriminator javaType="string"  column="gname">
            <case value="a" resultType="com.yanqun.entity.Student" >
                <result  column="sname" property="stuName"/>

            </case>

            <case value="b" resultType="student">
                <result  column="nickname" property="stuName"/>
            </case>
        </discriminator>

    </resultMap>

然后就根据班级来区分使用真名和昵称了;


最后附上:
ResultMap的所有属性以及含义
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值