Java中MyBatis的结果映射详解

 更新时间:2023年08月02日 10:37:59   作者:码匠_CodeArtist  
这篇文章主要介绍了Java中MyBatis的结果映射详解,MyBatis 支持对各种单表查询、关联查询等各种复杂查询的结果进行映射,MyBatis 是一款优秀的持久层框架,它的强大之处正是 SQL 语句映射,这一章介绍常用的结果映射,需要的朋友可以参考下

一、 概述

Java 数据持久层实现了应用程序与数据源的交互,大多数时候需要使用到各种查询语句。

MyBatis 支持对各种单表查询、关联查询等各种复杂查询的结果进行映射。

二、结果映射

resultMap 元素是 MyBatis 中最重要最强大的元素,大部分查询语句返回的结果,都能通过简单的配置来返回映射的 Java 对象。

假设存在这样一个实体模型,一个用户对应有一个基本信息和扩展信息,对应有多个地址。

简单讲,用户基本信息与用户扩展信息是一对一的关系,与用户地址是一对多的关系。

请添加图片描述

创建实体类和数据访问接口如下:

// 用户基本信息实体
@Data
public class User {
    private Long id;
    private String name;
    private String username;
    private String password;
    private Integer status;
    private UserExt extend;
    private List<Address> addresses;
}
// 用户扩展信息实体
@Data
public class UserExt {
    private Long id;
    private Long userId;
    private String phone;
    private String email;
}
// 用户地址信息实体
@Data
public class Address {
    private Long id;
    private Long userId;
    private String address;
}
// 用户相关接口
public interface UserExtMapper {
    // 查询用户基本信息
    User selectById(Long id);
    // 查询用户基本信息和扩展信息(一对一)
    User selectExt(Long id);
    // 查询用户基本信息和地址信息(一对多)
    User selectAddresses(Long id);
}

1. 基本映射

基本映射是对查询返回的结果映射成一个最简单的 JavaBean 类,通过类属性对应数据库字段进行映射。

<id><result> 元素都将列映射到一个简单的数据类型(String, int, double 等)的属性或字段。

其中的 property 对应 Java 类 属性名称,column 对应数据库列名称。

<mapper namespace="cn.codeartist.mybatis.mapper.UserExtMapper">
    <resultMap id="baseMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="status" column="status"/>
    </resultMap>
    <select id="selectById" resultMap="baseMap">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
</mapper>

2. 关联映射

关联映射是对查询返回的结果映射成一对一关系的嵌套类,例如查询同时返回用户基本信息和用户扩展信息。

使用 <association> 元素来指定关联映射,它可以映射一个关联查询语句的结果,也可以映射两个查询语句结合返回复杂的类型。

其中的 property 对应主表类型的属性,column 对应主表关联字段,javaType 对应关联表类型,select 对应另一个查询语句。

如果映射一个关联语句的结果,则不会使用 select 属性。

<mapper namespace="cn.codeartist.mybatis.mapper.UserExtMapper">
    <resultMap id="associationMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="status" column="status"/>
        <association property="extend" column="id" javaType="UserExt" select="selectUserExtById">
            <id property="id" column="id"/>
            <result property="userId" column="user_id"/>
            <result property="phone" column="phone"/>
            <result property="email" column="email"/>
        </association>
    </resultMap>
    <select id="selectExt" resultMap="associationMap">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="selectUserExtById" resultType="UserExt">
        SELECT * FROM t_user_ext WHERE user_id = #{id}
    </select>
</mapper>

3. 集合映射

集合映射是对查询返回的结果映射成一对多关系的嵌套类,例如查询同时返回用户信息和用户的地址信息。

使用 <collection> 元素来指定集合映射,它可以映射一个关联查询语句的结果,也可以映射两个查询语句结合返回复杂的类型。

它的用法与关联查询 <association> 类似,只不过指定关联表类型需要使用 ofType 属性,为了区分集合存储的类型。

<mapper namespace="cn.codeartist.mybatis.mapper.UserExtMapper">
    <resultMap id="collectionMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="status" column="status"/>
        <collection property="addresses" column="id" ofType="Address" select="selectAddressById">
            <id property="id" column="id"/>
            <result property="userId" column="user_id"/>
            <result property="address" column="address"/>
        </collection>
    </resultMap>
    <select id="selectAddresses" resultMap="collectionMap">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="selectAddressById" resultType="Address">
        SELECT * FROM t_address WHERE user_id = #{id}
    </select>
</mapper>

同时指定集合类型和 Java 类型:

<collection property="addresses" javaType="ArrayList" column="id" ofType="Address" select="selectAddressById"/>

4. 自动映射

MyBatis 支持在简单的场景下,可以自动映射结果,在复杂的场景下,只需描述语句之间的关系就行。

当配置自动映射结果时,数据库列名与 Java 类属性名称会忽略大小写映射,例如 ID 列会和 id 属性进行映射。

通常数据库列名使用下划线规范,而 Java 属性遵循驼峰命名,将 mapUnderscoreToCamelCase 设置为 true 时,会启用自动映射。

例如前面的基本映射、关联映射和集合映射可以简化成下面配置:

<mapper namespace="cn.codeartist.mybatis.mapper.UserExtMapper">
    <resultMap id="associationMap" type="User">
        <association property="extend" column="id" javaType="UserExt" select="selectUserExtById"/>
    </resultMap>
    <resultMap id="collectionMap" type="User">
        <collection property="addresses" column="id" ofType="Address" select="selectAddressById"/>
    </resultMap>
    <select id="selectById" resultType="User">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="selectExt" resultMap="associationMap">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="selectUserExtById" resultType="UserExt">
        SELECT * FROM t_user_ext WHERE user_id = #{id}
    </select>
    <select id="selectAddresses" resultMap="collectionMap">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="selectAddressById" resultType="Address">
        SELECT * FROM t_address WHERE user_id = #{id}
    </select>
</mapper>

到此这篇关于Java中MyBatis的结果映射详解的文章就介绍到这了,更多相关MyBatis的结果映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 完美解决idea创建文件时,文件不分级展示的情况

    完美解决idea创建文件时,文件不分级展示的情况

    这篇文章主要介绍了完美解决idea创建文件时,文件不分级展示的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot中Aware接口使用及原理解析

    SpringBoot中Aware接口使用及原理解析

    在Spring中存在一个Aware接口,实现该接口可以让我们的Bean获取到Spring容器中特定的资源,但该接口只是个标记接口,不存在任何方法,本文将给大家详细介绍一下SpringBoot中Aware接口使用及原理,需要的朋友可以参考下
    2023-08-08
  • springboot启动feign项目报错:Service id not legal hostnam的解决

    springboot启动feign项目报错:Service id not legal hostnam的解决

    这篇文章主要介绍了springboot启动feign项目报错:Service id not legal hostnam的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot解决java.lang.ArrayStoreException异常

    springboot解决java.lang.ArrayStoreException异常

    这篇文章介绍了springboot解决java.lang.ArrayStoreException异常的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • SpringBoot Profiles 多环境配置及切换

    SpringBoot Profiles 多环境配置及切换

    大部分情况下,我们开发的产品应用都会根据不同的目的,所以需要支持不同的环境,本文主要介绍了SpringBoot Profiles 多环境配置及切换,感兴趣的可以了解一下
    2021-12-12
  • SpringBoot 返回Json实体类属性大小写的解决

    SpringBoot 返回Json实体类属性大小写的解决

    这篇文章主要介绍了SpringBoot 返回Json实体类属性大小写的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中的@SneakyThrows注解详解

    Java中的@SneakyThrows注解详解

    这篇文章主要介绍了Java中的@SneakyThrows注解详解,@SneakyThrows将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息,需要的朋友可以参考下
    2023-10-10
  • Java根据前端返回的字段名进行查询数据的实现方法

    Java根据前端返回的字段名进行查询数据的实现方法

    在Java后端开发中,我们经常需要根据前端传递的参数(如字段名)来动态查询数据库中的数据,这种需求通常出现在需要实现通用查询功能或者复杂查询接口的场景中,所以本文介绍了Java根据前端返回的字段名进行查询数据的实现方法,需要的朋友可以参考下
    2024-12-12
  • springboot配置数据库密码特殊字符报错的解决

    springboot配置数据库密码特殊字符报错的解决

    这篇文章主要介绍了springboot配置数据库密码特殊字符报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • FastJson实现驼峰下划线相互转换方法详解

    FastJson实现驼峰下划线相互转换方法详解

    这篇文章主要介绍了使用FastJson进行驼峰下划线相互转换写法及误区,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01

最新评论