myabtis中MyBatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

MyBatis 结果映射解析

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及手动设置参数和获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

结果映射的工作流程

当 MyBatis 执行 SQL 后,需要将得到的 ResultSet 结果集转换为我们定义的 Java 对象,这个过程称为结果映射。MyBatis 提供了强大灵活的映射机制来完成这一转换。

1. 自动映射

在自动映射中,MyBatis 会自动查找与列名同名的属性名,并调用 setter 方法,完成属性的赋值操作。如果对象中的属性名和数据库中的列名不一致,可以通过 resultMap 来进行详细的配置。

2. resultMap 映射

resultMap 是 MyBatis 中最强大的映射方式,可以进行非常细致的配置。它可以将数据库的列和对象的属性进行精确的映射关联,包括复杂类型的映射,如集合、关联的其他对象等。

基本用法

<resultMap id="ExampleMap" type="Example">
    <id property="id" column="id_column"/>
    <result property="fieldName" column="column_name"/>
</resultMap>
  • id 元素表示主键的映射。

  • result 元素表示普通字段的映射。

高级映射

  • 关联的嵌套查询

    <association property="author" column="author_id" javaType="Author" select="selectAuthor"/>
  • 集合的嵌套查询

    <collection property="posts" ofType="Post" column="post_id" select="selectPosts"/>
  • 关联的嵌套结果

    <association property="author" javaType="Author">
        <id property="id" column="author_id"/>
        <result property="username" column="author_username"/>
    </association>
  • 集合的嵌套结果

    <collection property="posts" ofType="Post">
        <id property="id" column="post_id"/>
        <result property="subject" column="post_subject"/>
    </collection>

3. 构造器映射

MyBatis 还允许使用构造器映射,通过构造器来创建对象并设置属性。

<resultMap id="constructorExample" type="SomeClass">
    <constructor>
        <idArg column="id_column" javaType="int"/>
        <arg column="name_column" javaType="String"/>
    </constructor>
</resultMap>

在这里,constructor 元素定义了如何通过数据库的列来调用对象的构造器,idArgarg 分别对应构造器中的参数。

总结

MyBatis 的结果映射是一个非常灵活和强大的特性,它可以通过简单的自动映射到复杂的 resultMap 映射来满足不同层次的需求。通过合理使用这些映射方式,可以大大提高应用程序与数据库交互的效率和方便性。

最后更新于