• resultMap 和 resultType的用法和区别详解


    在这里插入图片描述

    博主 默语带您 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这个示例中,我们将查询的结果映射到了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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这些示例展示了不同的查询情况,每个查询都使用了 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    Mybatis的CRUD操作

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

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

    public class User {
        private int id;
        private String username;
        private String email;
        
        // 省略构造函数和Getter/Setter方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接下来,创建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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    <!-- 插入操作,添加用户 -->
    <!-- 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    总结

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

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

    参考资料

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

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

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

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

    在这里插入图片描述

  • 相关阅读:
    RTL乒乓运算模块设计 - Submodul Design
    零零信安-D&D数据泄露报警日报【第43期】
    分组后成员作为集合两两运算
    Git学习笔记3
    Nature全球潮汐可视化兼影像数据下载网站:Intertidal change
    mock-随机生成数据工具
    GBASE 8C——SQL参考6 sql语法(6)
    七个用于云原生世界的Java框架
    java学习day7(Java基础)方法和封装
    5、K8s控制器- Deployment
  • 原文地址:https://blog.csdn.net/qq_42055933/article/details/133916085