一、返回一般数据类型

比如要根据 id 属性获得数据库中的某个字段值。
mapper 接口:

1
2
//根据 id 获得数据库中的 username 字段的值
String getEmpNameById(Integer id);

SQL 映射文件:

1
2
3
4
5
6
7
8
9
10
<!-- 
指定 resultType 返回值类型时 String 类型的,
string 在这里是一个别名,代表的是 java.lang.String

对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap'
基本数据类型考虑到重复的问题,会在其前面加上 '_',比如 byte 对应的别名是 '_byte'
-->
<select id="getEmpNameById" resultType="string">
select username from t_employee where id = #{id}
</select>

二、返回 JavaBean 类型

比如根据某个字段获得数据库中的信息,把查询的结果信息封装成某个 JavaBean 类型的数据。
mapper 接口:

1
2
// 根据 id 查询信息,并把信息封装成 Employee 对象
Employee getEmpById(Integer id);

SQL 映射文件:

1
2
3
4
5
6
7
<!-- 
通过 resultType 指定查询的结果是 Employee 类型的数据
只需要指定 resultType 的类型,MyBatis 会自动将查询的结果映射成 JavaBean 中的属性
-->
<select id="getEmpById" resultType="employee">
select * from t_employee where id = #{id}
</select>

三、返回List类型

有时候我们要查询的数据不止一条,比如:模糊查询,全表查询等,这时候返回的数据可能不止是一条数据,对于多数据的处理可以存放在List集合中。
mapper 接口:

1
2
// 假如是全表查询数据,将查询的数据封装成 Employee 类型的集合
List<Employee> getAllEmps();

SQL 映射文件:

1
2
3
4
5
6
<!--
注意这里的 resultType 返回值类型是集合内存储数据的类型,不是 'list'
-->
<select id="getAllEmps" resultType="employee">
select * from t_employee
</select>

四、返回Map类型

MyBatis 还支持将查询的数据封装成Map。

  1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。
    mapper 接口:
    1
    2
    //  根据 id 查询信息,并把结果信息封装成 Map 
    Map<String, Object> getEmpAsMapById(Integer id);
    SQL 映射文件:
    1
    2
    3
    4
    5
    6
    <!-- 
    注意这里的 resultType 返回值类型是 'map'
    -->
    <select id="getEmpAsMapById" resultType="map">
    select * from t_employee where id = #{id}
    </select>
    下面把查询的结果数据贴出来供大家参考:
    1
    2
    {email=zysheep@126.com,username=李四}
    email 表中的字段名 username=字段对应的数据
  2. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。
    mapper 接口:
    1
    2
    3
    4
    // 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象
    // @MapKey 中的值表示用数据库中的哪个字段名作 key
    @MapKey("id")
    Map<Integer, Employee> getAllEmpsAsMap();
    SQL 映射文件:
    1
    2
    3
    4
    5
    6
    <!--
    注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型
    -->
    <select id="getAllEmpsAsMap" resultType="employee">
    select * from t_employee
    </select>
    下面是查询的结果 (只截取了一部分):
    1
    {16=Employee{id=16,username='James'}}
    MyBatis 允许查询的结果封装成Map,这种机制是极好的。

resultType,resultMap的区别

  1. 如果只是返回一个值,比如说String或者int,那直接用resultType就行了,resultType="java.lang.String
    1
    2
    3
    <select id="getUserName" resultType="java.lang.String">
    select user_name from t_users
    </select>
  2. 如果sql查询结果返回的列名和实体类中的字段名一致,可以使用resultTypeMyBatis会自动把查询结果赋值给和字段名一致的字段。
    1
    2
    3
    4
    5
    6
    7
    8
    @Data
    public class Users {

    private Long id;
    private String userName;
    private Integer sex;

    }
    Mapper:
    1
    2
    3
    <select id="getUsersType" resultType="com.zysheep.mybatis.domain.Users">
    select user_name userName, sex from t_users
    </select>
    如果不一致,sql语句中可以使用别名的方式使其一致。
  3. 当sql的列名和实体类的列名不一致,这时就可以使用resultMap了。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <resultMap id="userMap" type="com.zysheep.mybatis.domain.Users">
    <id property="id" column="id"/>
    <result property="userName" column="user_name"/>
    <result property="sex" column="sex"/>
    </resultMap>

    <select id="getUsersMap" resultMap="userMap">
    select id, user_name, sex from t_users
    </select>
    property是实体类的字段名,column是sql查询的列名。

对于简单的映射,resultType和resultMap区别不大。但是resultMap功能更强大,可以通过设置typeHander来自定义实现功能。