MyBatis 结果集映射ResultMap 介绍

2021-10-28 0 By admin

MyBatis 框架中在映射文件 Mapper.xml 中定义 SQL语句并将返回值映射到相应的对象中。

一、resultType 和 resultMap 概述

1.1、resultType 说明

当使用 resultType 做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的POJO中必须有和它相同的字段对应。因此对于单表查询的话用 resultType是最合适的。
但是如果在POJO中,数据库中字段名和POJO的对象属性无法对应的话,就不能使用呢 resultType,而应该使用 resultMap。

1.2、resultMap 说明

当使用 resultMap 做SQL语句返回结果类型处理时,通常需要在 mapper.xml 中定义 resultMap ,用于POJO对象和相应表字段的对应关系管理。

二、resultMap 示例

2.1、创建 User 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
  private Integer user_id;
  private String username;
  private String password;
}

2.2、创建 Mapper 接口

public interface UserMapper {
  List<User> getAll();
}

2.3、编写Mapper.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.hong.mapper.UserMapper">
  <!--
    resultMap: 自定义结果集映射规则
      id: 唯一标识, 方便被引用
      type: 映射到的实体类的全类名
   -->
  <resultMap id="user" type="org.hong.pojo.User">
    <!--
      id: 映射实体类中与主键对应的属性
        column: 主键列的列名
        property: 主键列对应的属性
     -->
    <id property="user_id" column="id"></id>
    <!-- result: 映射普通属性 -->
    <result property="username" column="name"></result>
    <result property="password" column="pwd"></result>
  </resultMap>
  <!--
    如果javaBen属性名和列名不一致, 不应该再使用resultType配置返回值类型
    而是使用resultMap引用自定义的结果集映射规则
   -->
  <select id="getAll" resultMap="user">
    select * from user
  </select>
</mapper>

2.4、测试代码

public class ResultMapTest {
  @Test
  public void tesResultMap(){
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    List<User> list = mapper.getAll();
    list.forEach(System.out :: println);

    sqlSession.commit();
    sqlSession.close();
  }
}