高级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进行数据持久层的操作。

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi1 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号1 天前
java函数式编程--入门基础
java·编程·函数式编程