首页 > 其他分享 >Mybatis学习笔记(五)——resultMap元素

Mybatis学习笔记(五)——resultMap元素

时间:2022-09-05 00:26:12浏览次数:84  
标签:Map 元素 笔记 MyBatis resultMap Mybatis id POJO

resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。下面我们先从最简单的功能开始介绍。

现有的 MyBatis 版本只支持 resultMap 查询,不支持更新或者保存,更不必说级联的更新、删除和修改。

1.resultMap元素的组成

resultMap 元素还可以包含以下子元素,代码如下。

<resultMap id="" type="">
    <constructor><!-- 类再实例化时用来注入结果到构造方法 -->
        <idArg/><!-- ID参数,结果为ID -->
        <arg/><!-- 注入到构造方法的一个普通结果 --> 
    </constructor>
    <id/><!-- 用于表示哪个列是主键 -->
    <result/><!-- 注入到字段或JavaBean属性的普通结果 -->
    <association property=""/><!-- 用于一对一关联 -->
    <collection property=""/><!-- 用于一对多、多对多关联 -->
    <discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
        <case value=""/><!-- 基于某些值的结果映射 -->
    </discriminator>
</resultMap>

其中:

  • <resultMap> 元素的 type 属性表示需要的 POJO,id 属性是 resultMap 的唯一标识。
  • 子元素 <constructor> 用于配置构造方法。当一个 POJO 没有无参数构造方法时使用。
  • 子元素 <id> 用于表示哪个列是主键。允许多个主键,多个主键称为联合主键。
  • 子元素 <result> 用于表示 POJO 和 SQL 列名的映射关系。
  • 子元素 <association>、<collection> 和 <discriminator> 用在级联的情况下。关于级联的问题比较复杂,在《MyBatis一对一关联查询》和《MyBatis一对多关联查询》一节详细讲解。

id 和 result 元素都有以下属性。

 

 一条 SQL 查询语句执行后会返回结果集,结果集有两种存储方式,即使用 Map 存储和使用 POJO 存储。

2. 使用Map存储

任何 select 语句都可以使用 Map 存储,代码如下。

<!-- 查询所有网站信息存到Map中 -->
<select id="selectAllWebsite" resultType="map">
    select * from website
</select>

在 WebsiteMapper 接口中添加以下方法。

public List<Map<String,Object>> selectAllWebsite();

Map 的 key 是 select 语句查询的字段名(必须完全一样),而 Map 的 value 是查询返回结果中字段对应的值,一条记录映射到一个 Map 对象中。
使用 Map 存储结果集很方便,但可读性稍差,所以一般推荐使用 POJO 的方式。

3.使用POJO存储结果集

因为 MyBatis 提供了自动映射,所以使用 POJO 存储结果集是最常用的方式。但有时候需要更加复杂的映射或级联,这时就需要使用 select 元素的 resultMap 属性配置映射集合。
修改 Website 类,代码如下。

package net.biancheng.po;
import java.util.Date;
public class Website {
    private int id;
    private String uname;
    private String url;
    private int age;
    private String country;
    private Date createtime;
    /* setter和getter方法*/
    @Override
    public String toString() {
        return "Website[id=" + id + ",uname=" + uname + ",url=" + url + ",age=" + age + ",country=" + country
                + ",createtime=" + createtime + "]";
    }
}

WebsiteMapper.xml 代码如下。

<!--使用自定义结果集类型 -->
<resultMap type="net.biancheng.po.Website" id="myResult">
    <!-- property 是 net.biancheng.po.Website 类中的属性 -->
    <!-- column是查询结果的列名,可以来自不同的表 -->
    <id property="id" column="id" />
    <result property="uname" column="name" />
</resultMap>

resultMap 元素的属性 id 代表这个 resultMap 的标识,type 标识需要映射的 POJO。我们可以使用 MyBatis 定义好的类的别名或自定义类的全限定名。
这里使用 property 元素指定 Website 的属性名称 uname,column 表示数据库中 website 表的 SQL 列名 name,将 POJO 和 SQL 的查询结果一 一对应。
WebsiteMapper.xml 中 select 元素配置代码如下。

<select id="selectAllWebsite" resultMap="myResult">
    select id,name,url from website
</select>

可以发现 SQL 语句的列名和 myResult 中的 column 一一对应。

4.resultType和resultMap的区别

 MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。

需要注意的是,resultMap 和 resultType 不能同时使用。

标签:Map,元素,笔记,MyBatis,resultMap,Mybatis,id,POJO
From: https://www.cnblogs.com/worthmove/p/16656615.html

相关文章

  • Mybatis学习笔记(四)——mapper常见标签
    1.select标签1.1简介在MyBatis中,select标签是最常用也是功能最强大的SQL语言,用于执行查询操作。select示例语句如下。<selectid="selectAllWebsite"resultTyp......
  • vue3项目-小兔鲜儿笔记-商品详情页01
    1.基础布局完成商品详情基础布局,路由配置,搭好页面架子  2.渲染面包屑编写一个钩子函数useGoods.js,将面包屑获取数据的逻辑抽取出来。//拿到商品信息import{......
  • mybatis 一对多 出现 Expected one result (or null) to be returned by selectOne()
    报错信息展示报错时的mapper.xml修改后的mapper.xml踩坑原因分析resultmap在映射的时候是会把多张表中相同的字段名当成同一个对象来看待比如上文中的c.id和u.id......
  • 20201330马榕辰第一,二章学习笔记
    第一章: 一.知识点归纳:第一章前半部分重在介绍课程和书本的基本情况,包括Unix / Linux的历史,其各种发行版,我了解到了一些基本情况。后半部分主要是 Linux的使用,Lin......
  • 《计算机网络-自顶向下方法》学习笔记
    TCP和UDPTCP服务TCP服务模型包括面向连接和可靠数据传输服务。当某个应用程序调用TCP作为其运输服务协议时,该应用程序就能获得来自TCP的这两种服务。面向连接的服......
  • 20201306吴龙灿学习笔记
    一、知识点归纳:第一章:引言主要内容:第一章是本书的引子,因为本书意在让我们学会Unix以及Linux相关只是,在高级语言的基础上进一步学习创造编程平台的基本语言,让我们学会硬......
  • 数据结构与算法学习笔记 —— 队列(Queue)
     队列Queue1.简介队列是一种有次序的数据集合,其特征是数据项的添加和移除分别发生在该集合的两端:-数据项的添加发生在尾端(rear)-现存数据的移除发生在首......
  • 信息安全系统设计与实现学习笔记1
    一、知识点归纳以及自己最有收获的内容1、知识点归纳第1章引言1、系统编程的作用——有效利用系统资源来开发应用软件;为学生打下扎实的专业基础2、本书目标强化学......
  • 第一周学习笔记1
    一、知识点总结:第一章:引言第一章是本书的引言部分,本章简单介绍了Unix的历史、Linux的开发及其各种发行版。本章还解释了Linux的启动过程,描述了Unix/Linux文件系统组织......
  • 20201329魏赫学习笔记一
    20201329信息安全系统设计与实现学习笔记①作业信息作业要求https://www.mosoteach.cn/web/index.php?c=interaction_homework&m=s_write&clazz_course_id=7C854F......