resultMap和自定义映射结果形式(ResultMapManage)以及ResultMap Vs ResultType

news/2025/9/20 10:05:11/文章来源:https://www.cnblogs.com/sly-345/p/19102041
 <resultMap id="ResultMapManage" type="com.javapandeng.po.Manage"><result property="id" column="id" jdbcType="INTEGER"/><result property="userName" column="userName" jdbcType="VARCHAR"/><result property="passWord" column="passWord" jdbcType="VARCHAR"/><result property="realName" column="realName" jdbcType="VARCHAR"/></resultMap>
<select id="getByMap" resultMap="ResultMapManage" parameterType="map">select <include refid="Manage_field"/>from manage where where 1=1<include refid="Manage_where"/></select>

好的,我们来彻底讲清楚 resultMap="ResultMapManage" 中的 ResultMapManage 是什么意思。

这是一个 MyBatis 框架中的核心概念,非常重要。

一、核心答案:它是什么?

ResultMapManage 是一个 id,是一个标识符(名字)。

它是在 MyBatis 的 Mapper XML 文件中,由一个 <resultMap> 标签定义的结果映射集唯一名称

你可以把它理解为:

  • 一个“说明书”或“映射规则”:它告诉 MyBatis:“当你从数据库查询到一条记录后,应该怎样把这条记录的各个字段,填充到一个 Java 对象的各个属性里。”

  • 一个“转换器”:它负责将 ResultSet(JDBC 查询返回的表格数据)转换成 Java 对象


二、为什么需要它?它解决了什么问题?

数据库的列(Column)名和 Java 类的属性(Property)名并不总是完全一致。即使一致,有时也需要进行一些特殊处理。<resultMap> 就是为了解决这个映射问题而存在的。

没有 resultMap 时(使用 resultType):

  • MyBatis 会基于“约定优于配置”的原则,自动地尝试将查询结果的列名与 Java 对象属性名进行匹配(通常是驼峰命名转换,如 user_name -> userName)。

  • 这种方式简单,但不灵活,无法处理复杂场景。

有 resultMap 时:

  • 显式地、手动地定义了映射规则,完全掌控了数据库列和Java属性之间的对应关系。

  • 你可以处理任意复杂的映射关系。


三、ResultMapManage 是如何定义的?

在你的某个 Mapper XML 文件中,肯定有这样一段定义(名字可能不叫 ResultMapManage,但结构一样):

xml
<!-- 1. 使用 <resultMap> 标签定义一个映射集,并给它一个唯一的 id -->
<resultMap id="ResultMapManage" type="com.javapandeng.po.Manage"><!-- 2. 定义主键映射(可选,但好习惯) --><id property="id" column="id" /><!-- 3. 定义普通属性的映射 --><result property="userName" column="user_name" /><result property="password" column="password" /><result property="realName" column="real_name" /><result property="createTime" column="create_time" jdbcType="TIMESTAMP"/><result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/><!-- 4. 可以处理更复杂的关联映射(一对一,一对多) --><!-- <association property="department" resultMap="AnotherResultMap"/> --><!-- <collection property="roles" ofType="Role" resultMap="RoleResultMap"/> -->
</resultMap>

这段代码解释:

  • <resultMap id="ResultMapManage" ...>: 这里就是定义了这个映射集的名字(ID)叫 ResultMapManage

  • type="com.javapandeng.po.Manage": 这个映射规则最终是要把一个数据库记录转换成 Manage 这个类型的 Java 对象。

  • <id> 和 <result>: 这是映射规则的核心。

    • column: 数据库表的列名user_name)。

    • property: Java 对象的属性名userName)。

    • jdbcType: (可选)指定数据库字段的类型,在某些特定场景下(如传入参数为null时)有助于 MyBatis 生成更精确的 SQL。


四、在什么地方使用它?(resultMap="ResultMapManage"

定义好之后,你就可以在任何需要返回 Manage 对象的 SQL 查询语句中引用它。

xml
<!-- 在 SELECT 语句中,使用 resultMap 属性(而不是 resultType)来引用我们定义好的映射集 -->
<select id="getManageById" resultMap="ResultMapManage">SELECT id, user_name, password, real_name, create_time, update_timeFROM manageWHERE id = #{id}
</select><select id="getAllManages" resultMap="ResultMapManage">SELECT * FROM manage <!-- 即使使用 SELECT *,也能靠 resultMap 正确映射 -->
</select>

当 MyBatis 执行 getManageById 这个查询时:

  1. 执行 SQL:SELECT ... FROM manage WHERE id = 1,得到一行结果。

  2. MyBatis 看到 resultMap="ResultMapManage",就知道要去寻找 id 为 ResultMapManage 的 <resultMap>

  3. 找到后,按照里面的规则,开始创建 Manage 对象并填充属性:

    • 将数据库列 user_name 的值,赋给 Java 对象的 userName 属性。

    • 将数据库列 create_time 的值,赋给 Java 对象的 createTime 属性。

    • ...以此类推。

  4. 最终,一个完整的、属性都已赋值的 Manage 对象就被返回给了调用方(如 Service 层)。


五、resultMap vs resultType

 
 
特性 resultMap (手动映射) resultType (自动映射)
控制力 。完全掌控映射过程。 。依赖默认规则。
灵活性 。可以处理列名和属性名不一致、复杂类型、关联查询。 。只能处理简单直接的映射。
代码量 需要编写额外的 <resultMap> 配置。 无需额外配置,直接指定Java类即可。
适用场景 强烈推荐用于所有正式项目,尤其是属性名和列名不一致或有关联查询时。 仅用于快速原型、测试或非常简单的场景。

总结

所以,resultMap="ResultMapManage" 中的 ResultMapManage

  1. 它是一个标识符,是你在 XML 中自定义的一套映射规则的名称

  2. 这套规则明确规定了数据库表的列 和 Java 对象的属性 之间的对应关系。

  3. 你在 SQL 查询标签(<select>)中通过 resultMap="ResultMapManage" 来引用这套规则,告诉 MyBatis:“请按照 ResultMapManage 这个说明书,把我查到的数据组装成 Java 对象。”

这是一种显式配置,优于隐式约定的做法,是现代 MyBatis 开发中的最佳实践,使得代码更加清晰、健壮和易于维护。

 

 

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

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

相关文章

嵌入式设备不能正常上网问题

问题描述 设置静态IP和默认网关,设备无法上网。尝试ping baidu.com 也无法ping通 解决方案 1.默认网关IP设置错了 默认网关IP = 路由器IP 当设备在当前的链路中找不到baidu的IP时,会把IP传输到路由器,路由器通过查找…

2、论文固定模板(背景过度结尾)

1、论文字数分配2、以上仅供参考,如有疑问,留言联系

go: 图片文件上传

一,代码 go //上传页面 func (ic *MediaController) Upload(c *gin.Context) {c.HTML(200, "upload.html", nil) }//接收上传,多张图片 func (ic *MediaController) Uploaded(c *gin.Context) {//得到form…

go: 生成缩略图

一,安装第三方库 $ go get -u github.com/disintegration/imaging go: downloading golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 go: downloading golang.org/x/image v0.31.0 go: added github.com/disi…

git: 报错: fatal: 协议错误:错误的行长度字符串:This 或 fatal: protocol error: bad line length character: This

一,报错信息: fatal: 协议错误:错误的行长度字符串:This 或 fatal: protocol error: bad line length character: This 二,出现的原因: 我修改了git项目的remote地址,是因为gitolite服务换了一台服务器,报错的原…

jquery: Justified gallery

一,官网 官网: https://miromannino.github.io/Justified-Gallery/ github: https://github.com/miromannino/Justified-Gallery二,使用 引入: <link rel="stylesheet" href="/static/justified/j…

安装crmeb

一,官网: https://www.crmeb.com/xiazai 代码站: https://gitee.com/ZhongBangKeJi/CRMEB 安装参考文档地址: https://doc.crmeb.com/single_open/open_v54/20389 二,下载 用git命令下载 $ git clone https://gitee.…

gin: 打包模板文件、静态文件到二进制文件中

一,默认html模板不会打包到二进制文件中 如果二进制文件的当前目录下不包含html模板文件路径,会报错如下 $ ./mediabank [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middlew…

gin: 判断是否ajax请求

一,代码 controller: //得到用户信息 func (ic *MediaController) User(c *gin.Context) {if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {c.JSON(http.StatusOK, gin.H{&qu…

gin: 静态文件

一,下载jquery 官网: https://jquery.com/ 从命令行下载: $ wget https://code.jquery.com/jquery-3.7.1.min.js 二,代码: 目录结构routes package routesimport ("github.com/gin-gonic/gin""mediab…

详细介绍:【论文精读】基于YOLOv3算法的高速公路火灾检测

详细介绍:【论文精读】基于YOLOv3算法的高速公路火灾检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

产品设计

产品设计2025-09-20 在设计tab时,如果数据没有加载出来,要么不切tab高亮,如果想切tab高亮,就先显示空白(因为还没拿到数据),或者旧的数据(依据产品性质)。 为了避免因为网络卡,或者没卡,没找到数据时,tab切…

An Empirical Study on Commit Message Generation using LLMs via In-Context Learning 论文笔记

介绍 (1) 发表:ICSE25 (2) 背景 最近的一些工作研究了基于 LLM 的提交信息生成,然而目前尚不清楚 LLM 通过 ICL 在该领域的表现如何 (3) 贡献 本文对通过 ICL 使用 LLM 进行提交信息生成进行了实证研究,并创建了一个…

实用指南:人工智能学习:Transformer结构中的编码器层(Encoder Layer)

实用指南:人工智能学习:Transformer结构中的编码器层(Encoder Layer)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

vcpkg 安装依赖

vcpkg install nlohmann-json

Java03课前问题列表

Java课前问题列表031.什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?不依赖于对象状态的方法、工具方法、工厂方法(用于创建对象)、主方法 main。 特性…

JavaScript错误处理完全指南:从基础到自定义错误实战

本手册深入讲解JavaScript错误处理机制,涵盖错误类型、try/catch/finally使用、自定义错误创建及实际应用场景,帮助开发者编写更健壮的代码。JavaScript错误处理手册 错误和异常在应用程序开发中是不可避免的。作为程…

1、论文准备

1、论文准备顺序2、项目要求 (AI智能评审) 3、论文字数要求4、论文不需要写题目 5、论文工期及金额6、记论文 7、机考打字格式 以上仅供参考,如有疑问,留言联系

Jetpack Navigation - 在 Fragment 中跳转到 Activity(4 种方式) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PION 游击

Day -70 只有 \(70\) 天了,是时候开坑了。 做昨天模拟赛的 T4,\(n=T=3\times 10^4\) 开了 \(2s\)。 感觉 \(O(Tn)\) 可以争一下,在 CF 的原上面过了。 可爱的搬题人,CF 上面只有 \(2\times 10^4\) 而且开了 \(7s\)…