查询返回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的所有属性以及含义