高级java每日一道面试题-2025年2月26日-框架篇[Mybatis篇]-Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式 ?

如果有遗漏,评论区告诉我进行补充

面试官: Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式 ?

我回答:

在Java高级面试中讨论MyBatis如何将SQL执行结果封装为目标对象并返回的过程时,我们可以从过程细节和映射形式两个方面来综合解答这个问题。以下是结合您提供的内容和之前的回答给出的一个更为全面的答案:

MyBatis将SQL执行结果封装为目标对象并返回的过程

  1. SQL语句执行

    • MyBatis首先读取配置文件(XML或注解)中的SQL语句,并通过SqlSession接口执行这条语句。
  2. 结果集解析

    • SQL语句执行后,数据库返回一个ResultSet。MyBatis负责解析这个结果集,将其转换为键值对的集合。
  3. 映射到目标对象

    • 根据预先定义的映射规则(可以是自动映射基于字段名匹配,也可以是显式定义的映射如ResultMap),MyBatis将结果集中的数据映射为Java对象。
  4. 返回对象

    • 映射完成后,MyBatis将这些对象返回给调用者。

映射形式

MyBatis支持多种映射形式,允许开发者根据具体需求选择最适合的方式:

  • resultType属性 :用于简单场景下,当查询结果集的列名与目标Java对象的属性名一致时,可以直接使用resultType指定目标类型,MyBatis会自动完成映射。

  • resultMap属性 :提供了更细粒度的控制,适用于复杂的SQL查询和结果集处理。通过<resultMap>标签明确指定哪些列对应于Java对象的哪些属性,以及如何进行类型转换等操作。

  • @Results@Result注解 :对于偏好使用注解而非XML配置的场景,可以通过这些注解来配置映射关系,功能上等同于XML中的resultMap

  • 列名别名:为了简化映射逻辑,可以在SQL查询中为列指定别名,使其直接对应Java对象的属性名,这样即使原列名与属性名不一致也能实现自动映射。

  • 嵌套映射 :支持复杂类型的映射,包括一对一、一对多的关系。使用association元素描述一对一关联,collection元素描述一对多关系。

示例代码

  • 使用resultType:

    xml 复制代码
    <select id="selectUser" resultType="com.example.User">
      SELECT * FROM user WHERE id=#{id}
    </select>
  • 使用resultMap:

    xml 复制代码
    <resultMap id="userMap" type="com.example.User">
      <id property="id" column="id"/>
      <result property="name" column="name"/>
      <result property="age" column="age"/>
    </resultMap>
    <select id="selectUserWithMap" resultMap="userMap">
      SELECT * FROM user WHERE id=#{id}
    </select>
  • 使用注解:

    java 复制代码
    @Results({
      @Result(property = "id", column = "id"),
      @Result(property = "name", column = "name"),
      @Result(property = "age", column = "age")
    })
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUser(int id);

综上所述,MyBatis提供了丰富的机制来灵活地将SQL执行结果映射为Java对象,无论是简单的自动映射还是复杂的嵌套映射,都能满足不同的业务需求。理解这些概念有助于开发者更高效地利用MyBatis进行数据持久层的操作。

相关推荐
程序员西西几秒前
详细介绍Spring Boot中用到的JSON序列化技术?
java·后端
雨中飘荡的记忆1 分钟前
MySQL 优化实战
java·mysql
豆豆的java之旅4 分钟前
深入浅出Activity工作流:从理论到实践,让业务流转自动化
java·运维·自动化·activity·工作流
一点 内容10 分钟前
深度解析OurBMC后端模式:全栈技术架构与运维实践
java·开发语言
q***235711 分钟前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql
合方圆~小文19 分钟前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椎49540 分钟前
苍穹外卖资源点整理+个人错误解析-Day10-订单状态定时处理(Spring Task)、来单提醒和客户催单
java·后端·spring
Y***h1871 小时前
eclipse配置Spring
java·spring·eclipse
東雪木1 小时前
变量与数据类型
java·开发语言
p***62991 小时前
CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
java·后端·spring