MyBatis:使用ResultMaps

resultMap元素是MyBatis中最重要最强大的元素。他的作用是告诉MyBatis将从结果集中取出的数据转换成开发者所需要的对象。
下面是最简单的映射语句示例:
    <select id="selectUserMap" resultType="map">
    SELECT * FROM tb_user
    </select>
selectUser的<select…/>元素执行一条查询语句,查询tb_user表所有数据。resultType=“map”表示返回数据时一个Map集合(使用列名作为key,列值作为value)
示例:测试ResultMaps
1.控制器
@GetMapping("/testMap")
public void testMap()
{
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
//查询TB_USER表所有数据返回List集合,集合中的每个元素都是Map
List<Map<String,Object>> list = sqlSession.selectList("org.fkit.mapper.UserMapper.selectUserMap");
//遍历List集合,打印每一个Map对象
list.forEach(row->System.out.println(row));
//提交事务
sqlSession.commit();
sqlSession.close();
}
控制台显示如下:
可以看到,查询语句返回的每一条数据都被封装成一个Map集合,列名作为Map集合的key,而列的值作为Map的value。
虽然数据被封装成Map集合返回,但是Map集合并不能很好的描述一个领域模型,在实际项目开发中更加建议使用JavaBean或POJO作为领域模型描述数据.
示例:将数据封装成User
1.Mapper
    <resultMap id="userResultMap" type="org.fkit.domain.User">
    <id property="id" column="ID" />
    <result property="name" column="NAME" />
    <result property="sex" column="SEX" />
    <result property="age" column="AGE" />
    </resultMap>
    <select id="selectUserMap" resultMap="userResultMap">
    SELECT * FROM tb_user
    </select>
2.控制器
@GetMapping("/testMap")
public void testMap()
{
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
//查询TB_USER表所有数据返回List集合,集合中的每个元素都是Map
List<User> list = sqlSession.selectList("org.fkit.mapper.UserMapper.selectUserMap");
//遍历List集合,打印每一个Map对象
list.forEach(row->System.out.println(row));
//提交事务
sqlSession.commit();
sqlSession.close();
}

在实际的项目开发中,还有更加复杂的情况,例如执行的是一个多表语句,而返回的对象关联到另一个家对象,此时简单的映射已经无法解决问题,必须使用<resultMap…/>元素完成关联映射
示例:多表映射
student表:
clazz表:
1.模型
public class Clazz implements Serializable
{
    private Integer id;
    private String code;
   
    //无参数构造器
    public Clazz()
    {
        super();
    }
…

public class Student implements Serializable
{
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private Clazz clazz;
   
    //无参数构造器
    public Student()
    {
        super();
    }
…
2.UserMapper
    <!-- 映射学生对象的resultMap -->
    <resultMap id="studentResultMap" type="org.fkit.domain.Student">
    <id property="id" column="ID" />
    <result property="name" column="NAME" />
    <result property="sex" column="SEX" />
    <result property="age" column="AGE" />
    <!-- 关联映射 -->
    <association property="clazz" column="CLAZZ_ID" javaType="org.fkit.domain.Clazz" select="selectClazzWithId" />
    </resultMap>
    <!-- 根据班级ID查询班级 -->
    <select id="selectClazzWithId" resultType="org.fkit.domain.Clazz">
    SELECT * FROM tb_clazz WHERE ID=#{id}
    </select>
    <!-- 查询所有学生信息 -->
    <select id="selecStudent" resultMap="studentResultMap">
    SELECT * FROM tb_student
    </select>
3.控制器
@GetMapping("/testStudent")
public void testStudent()
{
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
List<Student> studentList = sqlSession.selectList("org.fkit.mapper.UserMapper.selecStudent");
studentList.forEach(stu->System.out.println(stu));
sqlSession.commit();
sqlSession.close();
}