MyBatis resultmap结果映射

news/2025/2/5 19:27:10/文章来源:https://www.cnblogs.com/loubin/p/18700026

创建数据库和实体类

首先创建数据库student和teacher,并且每个学生对应一个老师,一个老师可以对应多个学生,数据库如下图:

 

 创建实体类Student

 1 package com.loubin.pojo;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6 
 7     Teacher teacher;
 8 
 9     @Override
10     public String toString() {
11         return "Student{" +
12                 "id=" + id +
13                 ", name='" + name + '\'' +
14                 ", teacher=" + teacher +
15                 '}';
16     }
17 
18     public Teacher getTeacher() {
19         return teacher;
20     }
21 
22     public void setTeacher(Teacher teacher) {
23         this.teacher = teacher;
24     }
25 
26     public int getId() {
27         return id;
28     }
29 
30     public void setId(int id) {
31         this.id = id;
32     }
33 
34     public String getName() {
35         return name;
36     }
37 
38     public void setName(String name) {
39         this.name = name;
40     }
41 }

 

创建实体类Teacher

 1 package com.loubin.pojo;
 2 
 3 import java.util.List;
 4 
 5 public class Teacher {
 6     private int id;
 7     private String name;
 8 
 9     List<Student> students;
10 
11     public List<Student> getStudents() {
12         return students;
13     }
14 
15     @Override
16     public String toString() {
17         return "Teacher{" +
18                 "id=" + id +
19                 ", name='" + name + '\'' +
20                 ", students=" + students +
21                 '}';
22     }
23 
24     public void setStudents(List<Student> students) {
25         this.students = students;
26     }
27 
28     public int getId() {
29         return id;
30     }
31 
32     public void setId(int id) {
33         this.id = id;
34     }
35 
36     public String getName() {
37         return name;
38     }
39 
40     public void setName(String name) {
41         this.name = name;
42     }
43 
44     public Teacher(int id, String name) {
45         this.id = id;
46         this.name = name;
47     }
48 }

 

一对多查询

Student类中除了基本类型id和name之外,还有一个自定义类teacher,所以在进行查询的时候,需要对查询到的结果进行映射处理,将查到的字段映射为对象teacher

在接口StudenMapper中定义getStudentById的方法,如下所示

package com.loubin.dao;import com.loubin.pojo.Student;
import org.apache.ibatis.annotations.Param;public interface StudentMapper {Student getStudentById(int id);
}

对应的映射文件StudentMapper.xm如下所示,其中使用了resultMap标签对结果进行映射,由于student对象中的属性teacher是类Teacher的对象,所以需要使用association标签进行映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.loubin.dao.StudentMapper"><resultMap id="studentMap" type="com.loubin.pojo.Student"><result column="sid" property="id"/><result column="sname" property="name"/><association property="teacher" javaType="teacher"><result property="id" column="tid"/><result property="name" column="tname"/></association></resultMap><select id="getStudentById"  resultMap="studentMap">select s.id  sid, s.name  sname, t.id tid, t.name tname from student as s, teacher as t WHERE s.tid = t.id and s.id = #{id};</select>
</mapper>

 

查询得到的结果如下

 

多对一查询

在类Teacher中有属性students,该属性是类Student的集合,所以需要使用resultMap中的collection标签进行映射,如下所示,创建接口TeacherMapper

package com.loubin.dao;import com.loubin.pojo.Teacher;
import org.apache.ibatis.annotations.Param;public interface TeacherMapper {Teacher getTeacherById(@Param("id") int id);
}

对应的映射文件TeacherMapper.xml如下所示

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.loubin.dao.TeacherMapper"><resultMap id="teacherMap" type="teacher"><result column="tid" property="id"/><result column="tname" property="name"/><collection property="students" ofType="student"><result column="sid" property="id"/><result column="sname" property="name"/></collection></resultMap><select id="getTeacherById"  resultMap="teacherMap">select s.id  sid, s.name  sname,  t.id tid, t.name tname from student as s, teacher as t WHERE s.tid = t.id and t.id = #{id};</select>
</mapper>

查询得到的结果如下

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linguistics-English-Textbooks: 上海外教社: 高校英语专业系列教材(修订版)

新世纪高校英语专业系列教材(修订版) https://we.sflep.com/books/newcenturymajor1.aspx教材特色 配套资源 特点 秉以新《国标》指导下的英语专业课程改革为导向精心架构,体系完备。 凝聚海内外英语专业教育界专家学者智慧,教材编写高屋建瓴、深入 浅出. 兼顾语言基本技能…

OCRmyPDF: 让图片 PDF 可复制、搜索的神器

翻开十年前的工作报告,面对泛黄的纸质合同,整理成摞的文献资料 - 这些场景总离不开扫描仪,将纸张材料转成 PDF 扫描件电子版。 但生成的 PDF 文件像一张张定格照片,既不能复制文字,也无法搜索关键词。 图片 今天推荐的开源项目:OCRmyPDF 专治各种"哑巴PDF"。它…

10. 正则表达式

一、什么是正则表达式正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅…

独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的

通过 Docker 环境变量,在启动容器时带入配置信息,自动写入配置文件中,完全免去了进入容器内部 vim 修改的步骤,真正实现在线客服系统1分钟上线。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上…

线段树详解

授人以鱼不如授人以渔本文尽量详细地讲述线段树的引入,实现,应用,以及相关进阶知识。 引入 引入线段树通用的例子: 给定一组整数\(nums\),定义两种操作修改列表里的第\(i\)个数据为\(val\) ①查询区间和\([L,R]\) ②为了同时实现两种操作,现在考虑处理\(nums\)的方式 简单…

[Python] 依赖注入的使用,多模块任务隔离

使用google/pinject(依赖注入库)搭建了一个多模块运行、相互隔绝的项目。定义全局单例的依赖注入容器:"""依赖注入容器"""from typing import Any, List, Type, TypeVar import pinject import pinject.findingclass Ioc:"""依…

关于设计模式的一点想法

《设计模式:可复用面向对象软件的基础》书评最早读这本《设计模式:可复用面向对象软件的基础》是在大学的时候。读了一些片段,看到了讲文本编辑器的滚动条装饰,觉得有点意思,可以用来做图形界面。记得有一天晚上上床睡觉后,和两位同寝室室友聊天。一位室友LL说,他为了找…

ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明

容器存储是容器应用运行时的数据保障,本次 ACK 容器存储监控的更新能够帮助用户全面、精细地掌控集群中的存储细节,快速定位业务运行过程中可能出现的 IO 瓶颈和 IO 问题,更好地保证业务的平稳运行。作者:邱圆辉(霜序) 背景 随着容器化应用的日益普及、业务规模的增长以及…

LLM大模型:deepseek浅度解析(三):R1的reinforcement learning复现

deepseek-R1比较创新的点就是reward函数了,其自创的GRPO方法,详解如下:https://www.cnblogs.com/theseventhson/p/18696408训练出了R1-zero和R1两个强化学习版本!幸运的是,GRPO的这个算法已经有人实现,并集成到huggingface啦,直接调用就行,demo在这里:https://gist.gi…

并发编程 - 线程同步(三)之原子操作Interlocked简介

原子操作是不可分割的操作单元,Interlocked提供硬件级别原子操作,比传统锁机制效率高。Interlocked支持多种原子操作,如增减、替换、位操作等,确保多线程安全。上一章我们了解了3种处理多线程中共享资源安全的方法,今天我们将更近一步,学习一种针对简单线程同步场景的解决…

从易用性到高级分析:五款优秀报表软件盘点

本文将为大家介绍五款报表软件,详细描述它们的功能亮点和适用场景。山海鲸报表、Qlik Sense、Looker、Domo和Power BI分别在自助分析、实时数据访问、数据整合、可视化以及人工智能支持等方面展现了强大的功能。这些软件适用于不同规模的企业,能够帮助企业实现数据的可视化、…

阿里云可观测 2024 年 12 月产品动态

阿里云可观测 2024 年 12 月产品动态