深度解析resultMap标签

article/2025/10/7 8:05:18

一般来说,一张表对应一份mapper映射文件,但部分属性在数据库中的存储并非直接存储其内容,而是存储其唯一标识,比如id,如下表中的员工政治面貌、部门、职级、岗位均是通过各个分表的id进行维护:

在这里插入图片描述


因此,我们可以在Mybatis的XML文件中,用resultMap标签,对数据库中的所有字段与Java实体类的各个字段进行一一对应:

<resultMap id="BaseResultMap" type="org.javaboy.vhr.model.Employee"><id column="id" property="id" jdbcType="INTEGER"/><result column="name" property="name" jdbcType="VARCHAR"/><result column="gender" property="gender" jdbcType="CHAR"/><result column="birthday" property="birthday" jdbcType="DATE"/><result column="idCard" property="idCard" jdbcType="CHAR"/><result column="wedlock" property="wedlock" jdbcType="CHAR"/><result column="nationId" property="nationId" jdbcType="INTEGER"/><result column="nativePlace" property="nativePlace" jdbcType="VARCHAR"/><result column="politicId" property="politicId" jdbcType="INTEGER"/><result column="email" property="email" jdbcType="VARCHAR"/><result column="phone" property="phone" jdbcType="VARCHAR"/><result column="address" property="address" jdbcType="VARCHAR"/><result column="departmentId" property="departmentId" jdbcType="INTEGER"/><result column="jobLevelId" property="jobLevelId" jdbcType="INTEGER"/><result column="posId" property="posId" jdbcType="INTEGER"/><result column="engageForm" property="engageForm" jdbcType="VARCHAR"/><result column="tiptopDegree" property="tiptopDegree" jdbcType="CHAR"/><result column="specialty" property="specialty" jdbcType="VARCHAR"/><result column="school" property="school" jdbcType="VARCHAR"/><result column="beginDate" property="beginDate" jdbcType="DATE"/><result column="workState" property="workState" jdbcType="CHAR"/><result column="workID" property="workID" jdbcType="CHAR"/><result column="contractTerm" property="contractTerm" jdbcType="DOUBLE"/><result column="conversionTime" property="conversionTime" jdbcType="DATE"/><result column="notWorkDate" property="notWorkDate" jdbcType="DATE"/><result column="beginContract" property="beginContract" jdbcType="DATE"/><result column="endContract" property="endContract" jdbcType="DATE"/><result column="workAge" property="workAge" jdbcType="INTEGER"/></resultMap>

数据库通过id进行主表与分表之间的关系维护,在实际应用中,我们也不会孤零零地只应用一张表的内容,而是经常会进行多表联查,后者让表与表之间产生关联,而我们若想让程序体现这些关联,不是单纯地建一个主类(比如员工类)、一个分类(比如部门类)就完事儿了,我们会在主体类的内部注入分类,比如员工类里会包含部门类、职级类、民族类等等:

public class Employee {// 对应数据库中主表存储的字段private Integer nationId;private Integer politicId;private Integer departmentId;private Integer jobLevelId;private Integer posId;// 对应数据库中主表依赖分表id所对应的各个分表private Nation nation;private Politicsstatus politicsstatus;private Department department;private JobLevel jobLevel;private Position position;// ...
}

这时候问题来了,我们在上面BaseResultMap中,仅仅对主表出现的字段进行了映射,也就是说,只有对应分表的id们和Java主体类的属性实现了映射(Employee类的上部分),但对象类字段——比如下部分的民族对象、政治面貌对象、部门对象等——还没有和所对应数据库的分表作映射呢!
如何实现这个映射?—— 在另一个resultMap标签中完成主表对象与关联分表对象的映射若该分表对象与主表为一对一关系(比如员工与部门,一个员工对应一个部门),则内部使用association标签;若该分表对象与主表为一对多关系(比如教师与课程,一个教师对应多个课程),则内部使用collection标签

<resultMap id="AllEmployeeInfo" type="org.javaboy.vhr.model.Employee" extends="BaseResultMap"><association property="nation" javaType="org.javaboy.vhr.model.Nation"><id column="nid" property="id"/><result column="nname" property="name"/></association><association property="politicsstatus" javaType="org.javaboy.vhr.model.Politicsstatus"><id column="pid" property="id"/><result column="pname" property="name"/></association><association property="department" javaType="org.javaboy.vhr.model.Department"><id column="did" property="id"/><result column="dname" property="name"/></association><association property="jobLevel" javaType="org.javaboy.vhr.model.JobLevel"><id column="jid" property="id"/><result column="jname" property="name"/></association><association property="position" javaType="org.javaboy.vhr.model.Position"><id column="posid" property="id"/><result column="posname" property="name"/></association></resultMap>

注意事项:

  1. association和collection标签里的property属性对应主类中该对象的属性名,该类的路径前者用javaType属性表示,后者用ofType属性;
  2. association和collection标签内部的id/result标签的column属性不一定与数据库表字段一致!而是与sql语句查询出的结果字段一致(比如利用AS关键字可以新定义查询出来的字段名),column与查询结果字段一致,切记切记

http://chatgpt.dhexx.cn/article/8gLIIFgC.shtml

相关文章

ResultType和ResultMap的区别

ResultType和ResultMap都是执行查询语句时返回的结果集 ResultType ResultType相对与ResultMap而言更简单一点。只有满足ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;时&#xff0c;即数据库表中的字段名和实体类中的属性完全一致时&#x…

resultMap的用法以及关联结果集映射

resultType resultType可以把查询结果封装到pojo类型中&#xff0c;但必须pojo类的属性名和查询到的数据库表的字段名一致。 如果sql查询到的字段与pojo的属性名不一致&#xff0c;则需要使用resultMap将字段名和属性名对应起来&#xff0c;进行手动配置封装&#xff0c;将结…

[MyBatis]-resultMap结果映射集详解

resultMap结果映射集详解 resultmap是mybatis中最复杂的元素之一&#xff0c;它描述如何从结果集中加载对象&#xff0c;主要作用是定义映射规则、级联的更新、定制类型转化器。 resultmap构成元素 元素子元素作用constructoridArg 、arg用于配置构造器方法id将结果集标记为id…

MyBatis中ResultMap详解

简介&#xff1a; MyBatis的每一个查询映射的返回类型都是ResultMap&#xff0c;只是当我们提供的返回类型属性是resultType的时候&#xff0c;MyBatis会自动的给我们把对应的值赋给resultType所指定对象的属性&#xff0c;而当我们提供的返回类型是resultMap的时候&#xff0…

MyBatis多表查询resultMap设定

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Result Maps 是什么 ResultMap 属性 一、Java数据访问接口 二、XML实现 1、*分步查询 延迟加载 三、Test 1.读入数据 总结 Result Maps 是什么 resultMap 元素是 M…

JS字符串替换指定字符

碰到一个后端数据同步过来的xml文本段&#xff0c;内容里写死的宽度 在1920*1080的分辨率屏幕上&#xff0c;显示有问题&#xff0c;由于数据量太多&#xff0c;前端单独拿数据再处理一遍 RegExp方法&#xff1a; function replaceAll(str, find, replace) {return str.repla…

shell内置字符串替换

shell变量赋值语法&#xff1a; 使用规则解释单引号所见即所得&#xff0c;即输出时会将单引号内的所有內容都原样输出&#xff0c;或者描述为单引号里面看到的是什么就会输出什么&#xff0c;这称为强引用双引号 (默认)输出双引号内的所有内容&#xff1b;如果内容中有命令(…

python字符串替换

str.replace(old, new[, max]) 参数 old – 将被替换的子字符串。 new – 新字符串&#xff0c;用于替换old子字符串。 max – 可选字符串, 替换不超过 max 次 返回值 返回字符串中的 old&#xff08;旧字符串&#xff09; 替换成 new(新字符串)后生成的新字符串&#xff0c;如…

C++ 字符串替换

好久没有更新了&#xff0c;最近有点忙&#xff0c;今天抽点时间给大家水 写一篇关于替换字符串字符的文章 替换函数 string类型的字符串可以用swap函数来替换字符&#xff0c;例如&#xff1a; 冒泡排序 #include <bits/stdc.h> using namespace std;int main () {i…

Python字符串替换方法replace

字符串替换方法replace str1 .replace(old_str&#xff0c;new_str&#xff0c;count)字符串的替换&#xff0c;将str1中的 old_str 替换成new_str old_str:将要被替换的字符串 new_str:新的字符串&#xff0c;替换成的字符串# count:替换的次数,默认是全部替换 返回值:得到一个…

Java字符串替换的方法

java中字符串替换方法主要有三种&#xff0c;分别是replace()、replaceAll()和replaceFirst()&#xff0c;这三种方法可以在三种不同情况应用&#xff0c;下面就由我来具体说明这三种方法的应用情况吧。 replace() replace的参数是char和CharSequence&#xff0c;即可以支持字…

sed 字符串替换

1. sed替换的基本语法为: sed s/原字符串/替换字符串/ 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。 2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下&#xff1a; # 要…

字符串的替换

一、字符串“打劫&#xff01;我有枪”&#xff0c;“枪”是敏感词汇&#xff0c;替换为“*”&#xff0c;并输出打印 二、字符串“北京欢迎你”&#xff0c;替换字符为“郑州欢迎你们”&#xff0c;并输出打印 package work.twelve;/* 一、字符串“打劫&#xff01;我有枪”…

两种字符串替换的方法

1.语法&#xff1a; public String replace(CharSequence target,CharSquence replacement) 注&#xff1a;旧字符换成新字符 示例&#xff1a;店小二在菜单上写下一个馒头一文&#xff0c;“一个”二字容易被他人添上一笔变成“十个”&#xff0c;于是决定把“一”替换成汉字…

7-8 字符串替换 (15 分)

7-8 字符串替换 &#xff08;15 分&#xff09; 本题要求编写程序&#xff0c;将给定字符串中的大写英文字母按以下对应规则替换&#xff1a; 输入格式&#xff1a; 输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式&#xff1a; 输出在一行中给出替…

全网最全Spring面试题之高级篇整理总结(共25题,附超详细解答)

1、什么是 Spring 框架&#xff1f;Spring 框架有哪些主要模块&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring 帮助开发者解决了开发中基础性的问题&#xff0c;使得开发人员可以专注于应用程序的开发。 Spring 框架本…

spring常见面试题(2023最新)

目录 前言1.spring是什么2.spring的设计核心是什么3.IOC和AOP面试题4.spring的优点和缺点5.spring中bean的作用域6.spring中bean的注入方式7.BeanFactory 和 ApplicationContext有什么区别&#xff1f;8.循环依赖的情况&#xff0c;怎么解决&#xff1f;9.spring中单例Bean是线…

spring面试题及答案

关注公众号&#xff0c;获取更多面试题及答案。 69道Spring面试题 1.什么是spring? Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发&#xff0c;并通过…

【2022版】Spring面试题整理(含答案解析)

1、不同版本的 Spring Framework 有哪些主要功能&#xff1f; 2、什么是 Spring Framework&#xff1f; Spring 是一个开源应用框架&#xff0c;旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构&#xff0c;允许用户选择组件&#xff0c;同时还为 …

Spring面试题大全含答案共79题(2022最全spring超级葵花宝典)

1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。 2. 使用Spring框架的…