当前位置: 首页 > article >正文

高级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:

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

    <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>
    
  • 使用注解:

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


http://www.kler.cn/a/586203.html

相关文章:

  • linux 下 ohmyzsh,miniconda 全局安装
  • 本地化语音识别CapsWriter结合内网穿透远程会议录音秒变文字稿
  • Java高频面试之集合-11
  • Day08 实例:3个网站实例探究算法对于密文加密的影响
  • Kafka 消费者组的重平衡
  • 深度学习优化-Gradient Checkpointing
  • ORACLE 19.8版本遭遇ORA-600 [kqrHashTableRemove: X lock].宕机的问题分析
  • CSS:不设定高度的情况,如何让flex下的两个元素的高度一致
  • 历次科技泡沫对人工智能发展的启示与规避措施
  • Python----计算机视觉处理(opencv:图片灰度化)
  • Unity屏幕适配——立项时设置
  • Python使用FastAPI结合Word2vec来向量化200维的语言向量数值
  • 缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?
  • 蓝思科技冲刺港股上市,双重上市的意欲何为?
  • TI的Doppler-Azimuth架构(TI文档)
  • 山东省新一代信息技术创新应用大赛-计算机网络管理赛项(样题)
  • LSTM方法实践——基于LSTM的汽车销量时序建模与预测分析
  • 华为OD机试-测试用例执行计划(Java 2024 D卷 100分)
  • MIFNet (论文阅读笔记)
  • 【实战篇】MySQL 时间字段的处理