Mybatis3系列课程-ResultMap

发布时间:2023年12月26日

简介

MyBatis3 的 resultMap 是一个配置元素(configuration element),用来声明一个自定义查询结果映射。在 MyBatis3 中,有三种类型的 resultMap:resultMap、association 和 collection。每个 resultMap 有一个唯一的标识 ID,通过 SQL Mapper 中的 select 映射元素(select element)引用它。

resultMap 的定义包含以下元素:

  • id:用于唯一标识该 resultMap。
  • type:结果集所映射成的 Java 对象类型。
  • extends:可以引用另外一个 resultMap,继承其属性,以避免代码冗余。
  • discriminator:可以根据查询结果返回不同的结果类型,类似于 Java 中的 switch 语句。
  • constructor:定义构造函数,用于生成映射类的实例。
  • id、result、association、collection:用来声明 resultMap 中的映射关系。

总的来说,resultMap 是 MyBatis3 中一个非常重要的配置元素,它可以帮助开发者完成更灵活、更复杂的数据映射任务。

学习目标?

1. 区分 ResultType 与ResultMap

2. 会使用ResultMap 做数据映射 , 主要体现在 一对一,一对多方面

本次内容, 我们来操作 grade 表,?

目前该表中 有2 列 分别为 gid 与gname

如果 我们设计的Grade.java 中的 属性 为 gid , gname 肯定数据会自动映射

但 如果 属性为 id 和name? 怎么办?

当 属性与数据库的列名 不一致 如何处理?? 可以配置resultMap

?当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,

操作步骤?

1. 编写Grade.java

package entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data     // 为属性生成get/set 方法
@AllArgsConstructor  // 全参构造器
@NoArgsConstructor   // 无参构造器
@ToString            // 生成toString()
public class Grade {

    private Integer id;
    private String name;

}

2. 编写 GradeMapper.java ,增加 查询全部年级信息的方法

package mapper;

import entity.Grade;

import java.util.List;

public interface GradeMapper {

    /**
     * 查询全部年级信息
     * @return
     */
    List<Grade> findAll();
}

3.编写GradeMapper.xml 增加 select 标签

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

    <!-- 查询全部-->
    <select id="findAll" resultType="grade">
        select * from grade
    </select>
    
</mapper>

4. 编写测试类

import entity.Grade;
import mapper.GradeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestGrade {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws IOException {
        // mybatis 配置文件的文件名
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void testFindAll() throws IOException {
        //获得SqlSession
        SqlSession session = sqlSessionFactory.openSession();
        GradeMapper mapper = session.getMapper(GradeMapper.class);
        List<Grade> list = mapper.findAll();
        list.forEach((e)->System.out.println(e));
    }
}

说明:

? ? ?grade表 有 gid,gname两列

? ? ?Grade.java 有 id 和name 两个属性

? ?目前表与实体类 的属性对应不上,

? 在 GradeMapper.xml 中查询时 ,先采用resultType 来 看下结果,发现 null.

?

配置ResultMap做映射?

resultMap 的配置 , 只需要修改 xxxMapper.xml 即可

打开 GradeMapper.xml 增加 resultMap

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

    <resultMap id="gradeMap" type="grade">
        <id column="gid" property="id"/>
        <result column="gname" property="name"/>
    </resultMap>
    <!-- 查询全部-->
    <select id="findAll"  resultMap="gradeMap">
        select * from grade
    </select>

</mapper>

运行测试类

总结?

文章来源:https://blog.csdn.net/ly121862/article/details/135214310
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。