美文网首页程序员
MyBatis结果映射中Association与Collecti

MyBatis结果映射中Association与Collecti

作者: 风静花犹落 | 来源:发表于2022-03-31 17:51 被阅读0次

关联方式

association: 一对一(one to one)
collection: 一对多(one to many)

实体对象

//角色实体
public class SysRole {
    private Integer id;
    private String roleName;
    //一个角色关联多个用户
    private List<SysUser> sysUserBos;
}

//用户实体
public class SysUser {
    private Integer id;
    private Integer roleId;
    private String userName;
    //一个用户关联一个角色
    private SysRole sysRoleBo;
}

Association用法

一、使用分步查询

SysRoleMapper.xml


<mapper namespace="com.jayknoxqu.mapper.SysRoleMapper">
    
    <select id="getSysRoleById" resultType="com.jayknoxqu.entity.SysRole">
        SELECT
            r.id,
            r.role_name 
        FROM
            sys_role r
        WHERE
            r.role_id = #{roleId}
     </select>
    
</mapper>

SysUserMapper.xml

<mapper namespace="com.jayknoxqu.mapper.SysUserMapper">

    <resultMap id="sysUserMap" type="com.jayknoxqu.entity.SysUser" >
        <id column="user_id" property="userId"/>
        <result column="role_id" property="roleId"/>
        <result column="user_name" property="userName"/>

        <association property="sysRoleBo" 
            column="role_id" 
            select="com.jayknoxqu.mapper.SysRoleMapper.getSysRoleById">
        </association>

    </resultMap>

    <select id="getSysUserById" resultMap="sysUserMap">
         SELECT
            u.id,
            u.role_id,
            u.user_name
        FROM
            sys_user u 
        WHERE
            u.id = #{userId}
    </select>

</mapper>

说明:

属性 描述
column 数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。 注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
select 用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
fetchType 可选的。有效值为 lazyeager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。

注意:MyBatis 能够对这样的查询进行延迟加载,因此可以将大量语句同时运行的开销分散开来。 然而,如果你加载记录列表之后立刻就遍历列表以获取嵌套的数据,就会触发所有的延迟加载查询,性能可能会变得很糟糕。

二 、嵌套结果映射

<mapper namespace="com.jayknoxqu.mapper.SysUserMapper">
    
    <resultMap id="sysUserMap" type="com.jayknoxqu.entity.SysUser">
        <id column="id" property="id" />
        <result column="user_name" property="userName"/>
        <association property="sysRoleBo" javaType="com.jayknoxqu.entity.SysRole">
           <id column="role_id" property="id" />
           <result column="role_name" property="roleName" />
        </association>  
    </resultMap>
    
    <select id="getSysUserById" resultMap="sysUserMap">
         SELECT
            u.id,
            u.role_id,
            u.user_name,
            r.role_name 
        FROM
            sys_user u
            LEFT JOIN sys_role r ON r.id = u.role_id 
        WHERE
            u.id = #{userId}
    </select>
    
</mapper>

Collection用法

一、使用分步查询

SysUserMapper.xml

<mapper namespace="com.jayknoxqu.mapper.SysUserMapper">
    
    <select id="getSysUserByRoleId" resultType="com.jayknoxqu.entity.SysUser">
         SELECT
            u.id,
            u.role_id,
            u.user_name
        FROM
            sys_user u
        WHERE
            u.role_id = #{roleId}
     </select>
    
</mapper>

SysRoleMapper.xml

<mapper namespace="com.jayknoxqu.mapper.SysRoleMapper">

    <resultMap id="sysUserMap" type="com.jayknoxqu.entity.SysRoleMapper" >
        <id column="id" property="id"/>
        <result column="role_name" property="roleName"/>

        <collection property="sysUserBos" 
            column="id" 
            select="com.jayknoxqu.mapper.SysRoleMapper.getSysUserByRoleId">
        </collection>

    </resultMap>

    <select id="getSysRoleById" resultMap="sysUserMap">
         SELECT
            r.id,
            r.role_name,
        FROM
            sys_role r 
        WHERE
            r.id = #{roleId}
    </select>

</mapper>

二 、嵌套结果映射

<mapper namespace="com.jayknoxqu.mapper.SysRoleMapper">

    <resultMap id="sysRoleMap" type="com.jayknoxqu.entity.SysRole">
         <id column="id" property="id" />
         <result column="role_name" property="roleName" />
         <collection property="sysUserBos" ofType="com.jayknoxqu.entity.SysUser" javaType="java.util.List" > 
             <id column="user_id" property="id" />
             <result column="user_name" property="userName" />
         </collection>
    </resultMap>
    
    
    <select id="getSysRoleById" resultMap="sysRoleMap">
         SELECT
            r.id,
            r.role_name,
            u.id AS user_id,
            u.user_name
        FROM
            sys_role r
            LEFT JOIN sys_user u ON u.role_id = r.id
        WHERE
            r.id = #{roleId}
    </select>

</mapper>

Association与Collection组合

一、实体对象

//组织实体
public class SysOrg {
    private Integer id;
    private String orgName;
}

//角色实体
public class SysRole {
    private Integer id;
    private Integer orgId;
    private String roleName;
    //一个角色关联一个组织
    private SysOrg sysOrgBo;
    //一个角色关联多个用户
    private List<SysUser> sysUserBos;
}

//用户实体
public class SysUser {
    private Integer id;
    private Integer roleId;
    private String userName;
}

二、XML配置

<mapper namespace="com.jayknoxqu.mapper.SysRoleMapper">

    <resultMap id="sysRoleMap" type="com.jayknoxqu.entity.SysRole">
         <id column="id" property="id" />
         <result column="role_name" property="roleName" />
        
         <association property="sysOrgBo" javaType="com.jayknoxqu.entity.SysOrg">
           <id column="org_id" property="id" />
           <result column="org_name" property="orgName" />
        </association>  

         <collection property="sysUserBos" ofType="com.jayknoxqu.entity.SysUser" javaType="java.util.List" > 
             <id column="user_id" property="id" />
             <result column="user_name" property="userName" />
         </collection>
    </resultMap>
    
    
    <select id="getSysRoleById" resultMap="sysRoleMap">
        SELECT
            r.id,
            r.role_name,
            o.id AS org_id,
            o.org_name,
            u.id AS user_id,
            u.user_name 
        FROM
            sys_org o
            LEFT JOIN sys_role r ON r.org_id = o.id
            LEFT JOIN sys_user u ON u.role_id = r.id 
        WHERE
            r.id = #{roleId}
    </select>

</mapper>

官网文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

相关文章

网友评论

    本文标题:MyBatis结果映射中Association与Collecti

    本文链接:https://www.haomeiwen.com/subject/elpnjrtx.html