美文网首页程序员
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