Mybatis3系列课程-ResultMap

本文介绍了MyBatis3中的resultMap元素,包括其作用、类型和配置要素。重点讲解了如何使用resultMap解决Java对象属性与数据库列名不一致的问题,以及在一对一和一对多映射中的应用,以Grade表为例进行详细操作演示。
摘要由CSDN通过智能技术生成

简介

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>

运行测试类

总结 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

射手座的程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值