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

相关推荐
wang09079 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java10 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
不知名的老吴11 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver11 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨898211 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
马士兵教育13 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
snow@li14 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
云烟成雨TD14 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework14 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java