Mybatis association(一对一)、collection(一对多)

association、collection属性说明

名称 说明
property 映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。否则 MyBatis 将会寻找给定名称的字段(field)。 无论是哪一种情形,你都可以使用常见的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。
column 数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。 注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
javaType 一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
ofType 这个属性非常重要,它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。
jdbcType JDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。 只需要在可能执行插入、更新和删除的且允许空值的列上指定 JDBC 类型。这是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 编程,你需要对可以为空值的列指定这个类型。
select 用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
resultMap 结果映射的 ID,可以将嵌套的结果集映射到一个合适的对象树中。 它可以作为使用额外 select 语句的替代方案。它可以将多表连接操作的结果映射成一个单一的 ResultSet。这样的 ResultSet 将会将包含重复或部分数据重复的结果集。为了将结果集正确地映射到嵌套的对象树中,MyBatis 允许你 “串联”结果映射,以便解决嵌套结果集的问题。想了解更多内容,请参考下面的关联元素。
typeHandler 使用这个属性,你可以覆盖默认的类型处理器。 这个属性值是一个类型处理器实现类的全限定名,或者是类型别名。
notNullColumn 默认情况下,在至少一个被映射到属性的列不为空时,子对象才会被创建。 你可以在这个属性上指定非空的列来改变默认行为,指定后,Mybatis 将只在这些列非空时才创建一个子对象。可以使用逗号分隔来指定多个列。默认值:未设置(unset)。
columnPrefix 当连接多个表时,你可能会不得不使用列别名来避免在 ResultSet 中产生重复的列名。指定 columnPrefix 列名前缀允许你将带有这些前缀的列映射到一个外部的结果映射中。 详细说明请参考后面的例子。
resultSet 指定用于加载复杂类型的结果集名字。
foreignColumn 指定外键对应的列名,指定的列将与父类型中 column 的给出的列进行匹配。
autoMapping 如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。注意,本属性对外部的结果映射无效,所以不能搭配 selectresultMap 元素使用。默认值:未设置(unset)。
fetchType 可选的。有效值为 lazyeager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。

备注

  1. column特殊用法,将外部查询字段转换成新查询条件

    <collection column="{aid=id}" select="xxx.findListByAid"/>
    
    <select id="findListByAid">
        SELECT 
        *
        FROM a
        where
        <if test="aid != null and aid != ''">
            and id = #{aid}
        </if>
    </select>
    
  2. 默认情况下,只有在至少一个属性不为空的前提下才会创建子对象,但是我们可以通过notNullColumn属性来控制这一行为,notNullColumn属性的取值是以,分隔的多个属性名称,只有在这些属性均不为空的前提下,子对象才会被创建。

巨人的肩膀

级联 association 一对一, 一对多 collection,多对多 discrimination_大阳彼岸的博客-CSDN博客_association 一对多

MyBatis ofType和javaType区别_spenglu的博客-CSDN博客_oftype

2021-06-11 mybatis collection column属性用法_qq_4240的博客-CSDN博客

mybatis的association以及collection的用法 - 简书 (jianshu.com)

MyBatis中文网

Mybatis源码之美:3.5.2.负责一对一映射的association元素和负责一对多映射的collection元素 - 简书 (jianshu.com)

posted @ 2022-06-19 21:32  疯狂马铃薯  阅读(195)  评论(0编辑  收藏  举报