详解ResultType
简单类型
八个基本类型+String。举例:
<select id="queryPersonCount" resultType="int">
select count(*) from person
</select>
接口方法:
int queryPersonCount();
输出参数为实体对象类型
举例:
<select id="queryPersonById" resultType="person" parameterType="int"> select * from person where id=#{id} </select>
接口方法:
Person queryPersonById(int id);
输出参数为实体对象类型的集合
有多个查询结果的情况。举例:
<select id="queryAll" resultType="person">
select * from person
</select>
接口方法:
List<Person> queryAll();
虽然输出类型为集合,但是resultType依然写集合的元素类型(resyltType=”person”),接口中的方法返回值要写集合类型list。
输出参数类型是HashMap
若返回值为HashMap,就需要有键值对。MyBatis实现的方式是在sql语句中给要查询的列名起一个别名,让别名作为key,查询的结果作为对应的value。举例:
<select id="queryPersonOutByHashMap" resultType="HashMap">
select id "mId", name "mName" from person where id=1
</select>
接口方法:
HashMap<String,Object> queryPersonOutByHashMap();
测试类中获取结果:
//查询人,返回值为HashMap public static void queryPersonOutByHashMap() throws IOException { ... HashMap<String,Object> personMap=personMapper.queryPersonOutByHashMap(); System.out.println(personMap); ... }
以上是查询只有一个返回的结果,如果有多个结果,那么xml文件中的resultType依旧是HashMap,但是接口方法需要用list(同第三种)。举例:
<select id="queryAllPersonOutByHashMap" resultType="HashMap">
select id "mId", name "mName" from person
</select>
接口方法:
List<HashMap<String,Object>> queryAllPersonOutByHashMap();
测试类中获取结果:
//查询人,返回值为HashMap的集合 public static void queryAllPersonOutByHashMap() throws IOException { ... List<HashMap<String,Object>> personMaps=personMapper.queryAllPersonOutByHashMap(); System.out.println(personMaps); ... }
当属性名和字段名不一致时
之前是使用ressultMap来实现的:
<select id="queryPersonByIdWithConverter" resultMap="resultPerson" parameterType="int"> select * from person where id=#{id} </select> <resultMap id="resultPerson" type="person"> <id property="num" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="sex" column="sex" javaType="boolean" jdbcType="INTEGER"/> </resultMap>
接口方法:
Person queryPersonByIdWithConverter(int id);
实际上还可以用resultType+HashMap的方式解决(前提是将实体类person中的id和name变量暂时改为mId和mName:
<select id="queryAllPersonOutByHashMap" resultType="person">
select id "mId", name "mName" from person
</select>
这么做的原理是,MyBatis根据sql语句中起的别名,将别名自动与person进行映射(原先是将实体类的属性和列名映射)。相当于MyBatis在自动映射时多了应该选择。
上面的当返回值时为HashMap的情况也用到了别名,但是这个别名是MyBatis拿过来作为HashMap的key值的,实现的道理不一样。
我们可以发现当属性名和字段名不一致时,使用resultType+HashMap比使用resultMap要简洁很多。我认为一般写resultMap主要是为了使用类型转换器。