mybatis中一对一关系association标签的使用

mybatis中一对一关系association标签的使用

association字面翻译为联合之意,Java项目开发中常遇到一对一关系的结果,例如,一个商品对应一个生产商,在查询结果中如果某两个对象是一对一关系一般使用association标签,用法有两种:

1,嵌套的resultMap,一次性查询出所有结果的相关字段,结果把所有字段映射到不同的对象的类变量中;

<resultMap id="map01" type="Model01">
    <id column="..." property="..."/>
    <result column="..." property="...">
    ...
    <!--Model01和Model02为一对一关系-->
    <association property="数据类型为Model02在Model01的类变量名称" javaType="Model02" resultMap="map02"/>
</resultMap>

<resultMap id="map02" type="Model02">
    <id column="..." property="..."/>
    <result column="..." property="...">
    ...
</resultMap>

<select id="select01" resultMap="map01">
    select ...最多查询出Model01,Model02所对应的所有字段 
    from table1(,table2可能需要) 
    where ... 
    order by ...
</select>

说明:分别有两个类Model01,Model02,但Model01中有一个类变量的数据类型为Model02 ,id为 select01 的SQL语句所查询的结果映射到 map01 的对应 Model01 对象的各类变量中,因 map01 中使用 association 标签,其 property属性 指定 Model01 中的数据类型为 Model02 的类变量,JavaType属性指定该类变量的数据类型,即Model02,resultMap属性指定对应的结果映射为 map02,map02中列出了相应的表子段和类变量的映射关系,所以一次查出所有需要的字段,只是按不同形式映射到相应各个类的类变量中;


2,嵌套的select语句,这种方式实为嵌套一个子查询语句查出关联的实体数据会产生N+1问题,在多次循环中不好,建议在java层面进行业务分离),例子如下:

<resultMap id="map03" type="Model03">
    <id column="..." property="..."/>
    <result column="..." property="...">
    ...
    <association property="数据类型为Model04在Model03的类变量名称" javaType="Model04" column="对应map03查询结果的某字段,并且该字段正是子查询select04对应需要的参数值" select="X命名空间.select04"/>
</resultMap>

<resultMap id="map04" type="Model04">
    <id column="..." property="..."/>
    <result column="..." property="...">
    ...
</resultMap>

<select id="select03" parameterType="Java某数据类型" resultMap="map03">
    select ...最多查询出Model03所对应的所有(不含Model04对应的字段)字段 
    from table1 
    where ... 
    order by ...
</select>

<select id="select04" parameterType="Java某数据类型" resultMap="map04">
    select ...最多查询出Model04所对应的所有字段 
    from table2 
    where ... 
    order by ...
</select>

说明:分别有两个类 Model03,Model04,但Model03中有一个类变量的数据类型为Model04 ,id 为 select03 的SQL语句所查询的结果映射到 map03 的对应 Model03 对象的各类变量中,因 map03 中使用 association 标签,其 property属性 指定 Model03 中的数据类型为 Model04 的类变量,column属性为 map03 中的某字段,该字段值正是子查询select04所需的参数,select属性为指定需要的子查询,即ID为select04的子查询,map04中列出本查询结果相应的表子段和类变量的映射关系,所以首先查出父对象所有需要的所有字段,完成映射,同时使用嵌套的子查询查出所需的字段并映射到相应的类,再把该类付给父级对象对应的变量;

个人简单总结,可能有错漏之处,欢迎拍照留言指点讨论...