- MyBatis结果映射中Association与Collecti
- MyBatis结果映射中Constructor与Discrimi
- Mybatis - association与collection
- mybatis中association和collection标签
- mybatis association , collectio
- mybatis association , collection
- mybatis-association
- Mybatis - association 分步查询
- mybatis 利用 association 或 collect
- 架构实战篇:使用MyBatis延迟加载模式为数据库减压,附演示实
关联方式
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 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。 |
select |
用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。 |
fetchType |
可选的。有效值为 lazy 和 eager 。 指定属性后,将在映射中忽略全局配置参数 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
网友评论