高级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 小时前
Spring MVC 核心组件详解
java·spring·mvc
好奇的菜鸟2 小时前
在IDEA中连接达梦数据库:详细配置指南
java·数据库·intellij-idea
山海不说话2 小时前
从零搭建微服务项目Pro(第2-2章——JSR303自定义文件校验+整合至微服务公共模块)
java·spring boot·后端·spring·微服务
Cloud_.2 小时前
Apifox Helper 自动生成API接口文档
java·ide·intellij-idea
知识浅谈4 小时前
@Validate 注解的使用-分组案例很有用
java·springboot
Trouvaille ~4 小时前
【Java篇】一法不变,万象归一:方法封装与递归的思想之道
java·开发语言·面向对象·javase·递归·方法·基础入门
Zhava4 小时前
MybatisPlus中的customSqlSegment动态拼接where条件
java·mybatis
qq_529835355 小时前
Java实现死锁
java·开发语言·python
牧小七5 小时前
Java --- 根据身份证号计算年龄
java·开发语言