MyBatis学习总结(五)

详解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主要是为了使用类型转换器。

发表评论