MyBatis之ResultMap的association和collection标签详解

一、前言

MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。

二、ResultMap 的属性列表

属性描述
id    当前命名空间中的一个唯一标识,用于标识一个结果映射。   
autoMapping如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
extends可以继承其他resultMap的一些写好的属性
type类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。

三、resultMap标签介绍

  • constructor - 用于在实例化类时,注入结果到构造方法中
    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果
  • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result – 注入到字段或 JavaBean 属性的普通结果
  • association – 一个复杂类型的关联;许多结果将包装成这种类型
    嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection – 一个复杂类型的集合
    嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
  • discriminator – 使用结果值来决定使用哪个 resultMap
    • case – 基于某些值的结果映射
      嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

四、id & result标签参数详解

属性描述
property映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。否则 MyBatis 将会寻找给定名称的字段(field)。 无论是哪一种情形,你都可以使用常见的点式分隔形式进行复杂属性导航。 人话为:就是你的Java实体类
column数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。
javaType一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
jdbcTypeJDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。 只需要在可能执行插入、更新和删除的且允许空值的列上指定JDBC 类型。这是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 编程,你需要对可以为空值的列指定这个类型。
typeHandler我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。 这个属性值是一个类型处理器实现类的全限定名,或者是类型别名。

- 常用例子展示

<resultMap  id="UsersMap" type="com.wang.test.demo.entity.User">
    <id property="id" column="id" jdbcType="INTEGER"/>
    <result property="username" column="username" jdbcType="VARCHAR"/>
    <result property="password" column="password" jdbcType="VARCHAR"/>
    <result property="role" column="role" jdbcType="VARCHAR"/>
    <result property="addTime" column="add_time" jdbcType="TIMESTAMP"/>
</resultMap>

五、association标签常用参数详解

例子演示

  • 实体类演示
@Data
//书籍
public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
    private Integer del;
    private Date publishdate;
    private String info;
    //把出版社对象当作属性
    private Publisher pub;//------重点在这里一本书对应一个出版社,这是一个出版社对象
}
@Data
//出版社
public class Publisher {
    private String id;
    private String name;
    private String phone;
    private String address;
}

- xml演示

<resultMap id="rMap_book" type="com.wang.test.demo.entity.Book">
	<!-- 主键  property为实体类属性 column为数据库字段 jdbcType为实体类对应的jdbc类型-->
    <id property="id" column="b_id" jdbcType="VARCHAR"></id>
    <!-- 普通属性  property为实体类属性 column为数据库字段  jdbcType为实体类对应的jdbc类型-->
    <result property="name" column="b_name" jdbcType="VARCHAR"></result>
    <result property="author" column="author" jdbcType="VARCHAR"></result>
    <result property="price" column="price" jdbcType="VARCHAR"></result>
    <result property="del" column="del" jdbcType="NUMERIC"></result>
    <result property="publisherid" column="publisher_id" jdbcType="VARCHAR"></result>
    <result property="publishdate" column="publish_date" jdbcType="TIMESTAMP"></result>
    <!--一对一映射association property 为实体类book中的属性名字 javaType为实体类属性的类型 -->
    <association property="pub" javaType="com.wang.test.demo.entity.Publisher">
        <id property="id" column="p_id" jdbcType="VARCHAR"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="phone" column="phone" jdbcType="VARCHAR"></result>
        <result property="address" column="address" jdbcType="VARCHAR"></result>
    </association>
</resultMap>

六、collection标签常用参数详解

例子演示

- 实体类演示

@Data
//班级类
public class Class {

    private String id;
    private String name;
    private List<Student> students;//----重点在这里,一个班级对应多个学生

}
@Data
public class Student {

    private int id;
    private String name;
    private int age;
}

- xml演示

<resultMap id="rMap_class" type="com.wang.test.demo.entity.Class">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <!--一对多映射用这个  ofTyp是一对多的集合的所存放的实体类  javaType实体类的属性类型-->
    <collection property="students" ofType="com.wang.test.demo.entity.Student" javaType="list">
        <id property="id" column="id" jdbcType="INTEGER"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="age" column="age" jdbcType="INTEGER"></result>
    </collection>
</resultMap>

七、jdbc Type与java Type对照表

附:表格来源

八、总结

这样就对ResultMap具体参数进行详细的解释,还有对association和collection标签的解释和具体演示,希望能够帮到你,一起学习,如果用到收藏一下呗!!!

参考:MyBatis之ResultMap的association和collection标签详解(图文例子)_resultmap 多层collection举例-CSDN博客

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MyBatis中,ResultMap是用来映射查询结果到Java对象的工具。AssociationResultMap中的一个标签,用于描述一个一对一的关联关系。 在ResultMap中使用Association标签可以定义一个复杂类型的关联关系,它可以将查询结果中的某些字段映射到一个子对象中。Association标签需要设置property属性来指定Java对象中对应的属性名,column属性来指定查询结果中对应的列名。 使用Association标签的示例代码如下所示: ``` <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id" /> <result property="orderNo" column="order_no" /> <association property="customer" javaType="Customer"> <id property="customerId" column="customer_id" /> <result property="customerName" column="customer_name" /> <result property="customerAddress" column="customer_address" /> </association> </resultMap> ``` 在这个示例中,我们定义了一个名为orderResultMapResultMap,映射的Java对象类型是Order。在Order对象中,有一个名为customer的属性,它是一个Customer类型的对象。使用Association标签,我们定义了customer属性的映射关系,将查询结果中的customer_id映射到Customer对象的customerId属性,将customer_name映射到customerName属性,将customer_address映射到customerAddress属性。 这样,在查询结果中如果有对应的关联数据,MyBatis就会自动将查询结果映射到Java对象的关联属性中。 希望这个解释能帮到你,如果有需要进一步了解的话可以收藏起来哦!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MyBatisResultMap的associationcollection标签详解(图文例子)](https://blog.csdn.net/qq_52423918/article/details/120828850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mybatisresultmap、associationcollection使用](https://blog.csdn.net/weixin_44236424/article/details/125765174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T_BUG袁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值