resultMap 和 resultType的用法和区别详解

news2025/1/18 7:36:53

resultMap 和 resultType的用法和区别详解

  • 《resultMap 和 resultType的用法和区别详解》
    • 摘要
    • 引言
    • resultType - 用法和映射示例
      • 了解resultType
      • 示例演示
    • resultMap - 区别、高级用法和自定义映射规则详解
      • resultType vs. resultMap
      • 高级用法
      • 示例演示
    • Mybatis的CRUD操作
    • 总结
    • 参考资料

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨

在这里插入图片描述

《resultMap 和 resultType的用法和区别详解》

摘要

作为一位Java博主,我热衷于分享有关MyBatis的知识。在本篇博客中,我将深入探讨MyBatis中的 resultMapresultType 的用法和区别。这两个概念在数据库结果映射中扮演着重要的角色。通过丰富的内容、示例代码以及深入的研究,我们将解开它们的奥秘,以帮助您更好地利用它们在Java应用程序中进行数据映射。

引言

在现代的Java应用程序开发中,数据库查询和结果映射是一个常见的任务。MyBatis是一个流行的持久层框架,用于简化数据库操作。在MyBatis中,resultMapresultType 是两个关键概念,用于将数据库查询结果映射到Java对象上。但它们有什么区别,如何正确使用它们,以及它们的内部工作原理是怎样的呢?在下面的内容中,我们将逐一深入探讨。

resultType - 用法和映射示例

了解resultType

在MyBatis中,resultType 用于定义简单的结果映射。这意味着您可以将查询结果映射到一个简单的Java对象,通常是一个POJO类。通过指定 resultType,您告诉MyBatis如何将数据库中的列映射到Java对象的属性。

示例演示

让我们看一个示例,假设我们有一个用户表,我们想要查询用户的信息并将其映射到一个User对象中。下面是一个使用 resultType 的示例:

public class User {
    private int id;
    private String username;
    private String email;
    // 其他属性和方法
}
<select id="selectUser" resultType="com.example.User">
  SELECT * FROM users WHERE id = #{id}
</select>

在这个示例中,我们将查询的结果映射到了com.example.User类中的属性,通过列名与属性名的匹配,MyBatis会自动完成映射工作。


当编写技术博客或文档时,为了更好地解释和展示概念,通常会提供多个示例。以下是进一步扩展的 resultType 示例:

public class User {
    private int id;
    private String username;
    private String email;
    // 其他属性和方法
}
<!-- 示例1:查询用户信息 -->
<select id="selectUser" resultType="com.example.User">
  SELECT * FROM users WHERE id = #{id}
</select>

<!-- 示例2:查询订单信息 -->
<select id="selectOrder" resultType="com.example.Order">
  SELECT * FROM orders WHERE user_id = #{userId}
</select>

<!-- 示例3:查询产品信息 -->
<select id="selectProduct" resultType="com.example.Product">
  SELECT * FROM products WHERE product_id = #{productId}
</select>

这些示例展示了不同的查询情况,每个查询都使用了 resultType 来将查询结果映射到不同的Java对象(UserOrderProduct)。这有助于读者更好地理解如何在不同情况下使用 resultType 来映射数据。您可以根据您的文档目的和读者需求添加更多示例。

resultMap - 区别、高级用法和自定义映射规则详解

resultType vs. resultMap

现在让我们深入研究 resultMap,以了解它与 resultType 之间的区别。resultMap 提供了更高级的映射功能,允许您定义复杂的映射规则,特别适用于多表查询和自定义映射。

高级用法

resultMap 不仅仅是将列映射到属性这么简单。它还支持高级用法,比如:

  • 嵌套映射:将一个对象嵌套到另一个对象中。
  • 关联查询:将多个表的数据关联到一个对象中。
  • 自定义映射:定义自定义的映射规则,可以使用Java代码来处理复杂的映射情况。

示例演示

下面是一个使用 resultMap 的示例,展示如何处理一个包含关联查询的情况:

<resultMap id="userResultMap" type="com.example.User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name" />
  <result property="email" column="user_email" />
  <!-- 其他属性映射 -->
</resultMap>

<select id="selectUser" resultMap="userResultMap">
  SELECT u.*, p.phone_number
  FROM users u
  LEFT JOIN user_phones p ON u.id = p.user_id
  WHERE u.id = #{id}
</select>

在这个示例中,我们定义了一个 resultMap,用于处理包含关联查询的情况,并自定义了属性到列的映射规则。

Mybatis的CRUD操作

当使用MyBatis执行数据库的增删改查(CRUD)操作时,通常不需要结果映射,因为这些操作返回的是受影响的行数。我将为您提供一个包含增删改查操作的MyBatis示例,并为每个操作添加了注释来解释代码。

首先,您需要创建一个名为 User 的Java类,它将表示数据库中的用户表:

public class User {
    private int id;
    private String username;
    private String email;
    
    // 省略构造函数和Getter/Setter方法
}

接下来,创建MyBatis映射文件(XML配置文件),以及配置数据库连接信息和SQL语句。以下是一个包含增删改查操作的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.UserMapper">
    <!-- 插入操作,添加用户 -->
    <insert id="insertUser" parameterType="com.example.User">
        INSERT INTO users (username, email) VALUES (#{username}, #{email})
    </insert>
    
    <!-- 更新操作,根据用户ID更新用户信息 -->
    <update id="updateUser" parameterType="com.example.User">
        UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}
    </update>
    
    <!-- 删除操作,根据用户ID删除用户 -->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
    
    <!-- 查询操作,根据用户ID查询用户信息 -->
    <select id="selectUserById" parameterType="int" resultType="com.example.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

现在,让我们添加注释来解释这些操作:

<!-- 插入操作,添加用户 -->
<!-- parameterType 指定输入参数类型,即 User 对象 -->
<!-- #{username} 和 #{email} 是占位符,用于插入 User 对象的属性值 -->
<!-- INSERT INTO users 后面的列名和占位符顺序必须匹配 User 对象的属性顺序 -->
<insert id="insertUser" parameterType="com.example.User">
    INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>

<!-- 更新操作,根据用户ID更新用户信息 -->
<!-- parameterType 指定输入参数类型,即 User 对象 -->
<!-- #{username}、#{email} 和 #{id} 是占位符,用于更新 User 对象的属性值和 ID -->
<update id="updateUser" parameterType="com.example.User">
    UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}
</update>

<!-- 删除操作,根据用户ID删除用户 -->
<!-- parameterType 指定输入参数类型,即用户ID的整数类型 -->
<!-- #{id} 是占位符,用于删除特定ID的用户 -->
<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

<!-- 查询操作,根据用户ID查询用户信息 -->
<!-- parameterType 指定输入参数类型,即用户ID的整数类型 -->
<!-- resultType 指定查询结果的映射类型,即 User 对象 -->
<!-- #{id} 是占位符,用于查询特定ID的用户 -->
<!-- 查询结果将自动映射到 User 对象中 -->
<select id="selectUserById" parameterType="int" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>

这是一个完整的MyBatis示例,包括了插入、更新、删除和查询操作,每个操作都有相应的注释来解释代码的作用和配置。在实际应用中,您可以使用MyBatis的SqlSession来执行这些操作,并根据需要捕获异常来处理数据库操作。

总结

通过本篇博客,我们深入探讨了MyBatis中的 resultMapresultType 的用法和区别。了解这两个概念对于有效地进行数据库查询和结果映射非常重要。resultType适用于简单的查询,而resultMap则提供了更高级、自定义的映射规则,适用于复杂查询场景。

希望这篇博客对您有所帮助,如果您有任何问题或需要进一步了解,欢迎在评论中提问。

参考资料

  • MyBatis官方文档
  • MyBatis中文文档

这篇博客深入研究了MyBatis中的 resultMapresultType,并提供了示例和扩展内容,以帮助读者更好地理解和应用这些重要的概念。希望您享受阅读并从中受益。😊📚🔍

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

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

相关文章

信息保卫战:揭秘迅软DSE护航企业免受泄密之害

随着网络技术的发展&#xff0c;通过网络应用如网盘、网页、邮件、即时通讯工具传输分享文件变得越来越多&#xff0c;这些工具传输速度快&#xff0c;能够将大容量的文档快速传送给他人&#xff0c;在工作中受到许多人的青睐。 然而由这些传输工具引发的泄密事件也不断增多&am…

进程概念[下]

一、 进程优先级 0x01 什么叫进程优先级 CPU资源分配的先后顺序 0x02 为什么要有进程优先级 因为资源不足,是分配资源的一种方式,优先权高的进程有优先执行权利 0x03 查看更加详细的进程信息 ①运行代码 #include<iostream> #include<unistd.h> using na…

Cesium 空间量算——方位角量测

文章目录 需求分析需求 实现对方位角的量测功能 分析 可以通过Cesium API提供的方法手动实现方位角测量。下面是一个可以帮助你开始实现方位角测量的代码示例: // 初始化Cesium Viewer var viewer = new Cesium.Viewer(cesiumContainer);// 创建材质

第六章redux的使用(餐饮版)

文章目录 一、redux的使用1、redux原理图解析 二、同步计算器案例2、创建src/redux/constant.js&#xff08;食材库&#xff09;3、创建src/redux/store.js&#xff08;厨房&#xff09;3-1、安装redux3-2、store.js 4、count_reducer.js&#xff08;厨师&#xff09;5、count_…

如何从SEO角度写好原创文章并吸引人

不会写原创文章的站长&#xff0c;不能算是好的站长哦。SEO原创文章对于网站优化来说&#xff0c;就像吃饭对于人的生存一样重要。如果一个SEO博客全是复制粘贴别人的文章&#xff0c;那这个博客还有多少意义呢&#xff1f;这就好比别人辛苦种田&#xff0c;你却轻易地把人家的…

Profinet转Modbus RTU网关连接PLC与多功能电表modbus通讯配置案例

Profinet是一种工业以太网通讯协议&#xff0c;广泛用于工业自动化系统中。而Modbus RTU是一种串行通信协议&#xff0c;常用于PLC和仪表之间的通讯。Profinet转Modbus RTU网关(XD-MDPN100)的作用就是将Profinet协议转换为Modbus RTU协议&#xff0c;从而实现PLC和多功能电表之…

zabbix-agnet连接zabbix-proxy

先配置好zabbix-proxy zabbix-proxy配置http://t.csdnimg.cn/RpaCI 在zabbix-proxy服务器上 [rootcloudserver ~]# grep ^[a-Z] /etc/zabbix/zabbix_agentd.conf PidFile/var/run/zabbix/zabbix_agentd.pid LogFile/var/log/zabbix/zabbix_agentd.log LogFileSize0 Server19…

Java 常用类(包装类)

目录 八大Wrapper类包装类的分类 装箱和拆箱包装类和基本数据类型之间的转换常见面试题 包装类方法包装类型和String类型的相互转换包装类常用方法&#xff08;以Integer类和Character类为例&#xff09;Integer类和Character类的常用方法 Integer创建机制&#xff08;面试题&a…

ims-ui项目搭建

node版本&#xff1a; npm版本&#xff1a; 创建vite项目&#xff1a; npm create vitelatest 使用的vite版本为&#xff1a; 安装router4,安装命令如下&#xff1a; npm install vue-router4 安装pinia&#xff0c;安装命令如下&#xff1a; npm install pinia 安装Pinia持…

SLAM从入门到精通(利用数据集来离线制图)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们的测试大部分都是基于仿真来实现的。但是很多时候&#xff0c;我们其实希还是望自己的算法能够跑在真实场景的数据上。可问题来了&#xf…

MinIO (二) .net core中实现上传下载

这篇文章里&#xff0c;我们介绍在.net core webapi项目中操作MinIO。 首先要创建一个桶&#xff0c;命名为demo 英文文档看不太顺畅&#xff0c;在网上找了一个api中文文档&#xff0c;可供参考 .NET Client API参考文档 - MinIO 帮助文档 - 开发文档 - 文江博客 创建桶 点…

偏偏不信文心大模型4.0比肩GPT-4!我为它们安排了一场龙虎斗!

作者 | 卖萌酱 大家好&#xff0c;我是卖萌酱。盲猜点进本文的不少小伙伴也看了昨天的百度世界大会&#xff0c;百度创始人、董事长兼CEO李彦宏官宣文心大模型4.0发布&#xff0c;其中一句话让卖萌酱印象深刻&#xff1a;文心大模型4.0综合水平与GPT-4相比已经毫不逊色&#xf…

python二次开发Solidworks:画砂轮

先根据输入参数计算出绘制砂轮需要的数据&#xff0c;然后绘制草图&#xff0c;完全标注后生成旋转体&#xff0c;具体代码如下&#xff1a; import sympy as sy import numpy as np import matplotlib.pyplot as pltx1,y1为第一条直线端点坐标(-10,0),theta_l1为角度,取5*np.…

C语言实现用弦截法求 f(x)=x^3-5*x^2+16*x-80=0 的根

完整代码: //用弦截法求 func(x)x^3-5*x^216*x-800 的根 //弦截法就是用函数上两点&#xff0c;连线的斜率近似代替f(x) //公式为Xn1Xn−(Xn−Xn−1)*func(Xn)/(func(Xn)−f(Xn−1))#include<stdio.h> #include<math.h>//求f(x)的值 double func(double x){return…

博客后台模块

一、后台模块-准备工作 1. 前端工程启动 前端工程下载链接 https://pan.baidu.com/s/1TdFs4TqxlHh4DXyLwYuejQ 提取码&#xff1a;mfkw 项目sql文件下载链接 链接&#xff1a;https://pan.baidu.com/s/1DQCGN4wISSDlOkqnVWYwxA 提取码&#xff1a;mfkw 命令行进入keke-vu…

工业4.0时代数字化工厂的几个特点

随着工业4.0时代的到来&#xff0c;数字化工厂成为了制造业的重要组成部分。数字化工厂管理系统是一种应用数字化、自动化和物联网等技术与产业融合的全新生产方式&#xff0c;旨在提高生产效率、降低成本、提升产品质量&#xff0c;并增强企业的核心竞争力。 数字化工厂的核心…

用友GRP-U8 SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业&#xff0c;基于云计算技术所推出的新一代产品&#xff0c;是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8的bx_historyDataCheck jsp、slbmbygr.jsp等接口存…

链上房产赛道项目 ESTATEX 研报:以 RWA 的方式释放房产市场的潜力

在上个世纪初&#xff0c;随着全球人口的指数型增长以及城市化趋势加速&#xff0c;全球房地产行业逐渐进入到发展的爆发期与红利期。一方面人口的暴增与城市化进程的的加速&#xff0c;让住宅和商业房地产逐渐形成了刚需&#xff0c;另一方面全球经济飞速发展&#xff0c;让越…

Leetcode.4 寻找两个正序数组的中位数

题目链接 Leetcode.4 寻找两个正序数组的中位数 hard 题目描述 给定两个大小分别为 m m m 和 n n n 的正序&#xff08;从小到大&#xff09;数组 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O…

Pinia学习-存储数据、修改数据以及持久化实现

Pinia是什么&#xff1f; Pinia 是 Vue 的存储库&#xff0c;实现全局变量的定义 这里定义的变量信息&#xff0c;任何页面都可以使用&#xff0c;代替原来的VueX 官网&#xff1a;https://pinia.web3doc.top/ 4.2 Pinia存储数据 4.2.1获取存储数据 实现步骤&#xff1a;…