resultMap元素
resultMap
元素有很多子元素和一个值得深入探讨的结构。 下面是resultMap
元素的概念视图。
constructor
- 用于在实例化类时,注入结果到构造方法中idArg
- ID 参数;标记出作为 ID 的结果可以帮助提高整体性能arg
- 将被注入到构造方法的一个普通结果
id
– 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能result
– 注入到字段或 JavaBean 属性的普通结果association
– 一个复杂类型的关联;许多结果将包装成这种类型- 嵌套结果映射 – 关联可以是
resultMap
元素,或是对其它结果映射的引用
- 嵌套结果映射 – 关联可以是
collection
– 一个复杂类型的集合- 嵌套结果映射 – 集合可以是
resultMap
元素,或是对其它结果映射的引用
- 嵌套结果映射 – 集合可以是
discriminator
– 使用结果值来决定使用哪个resultMap
case
– 基于某些值的结果映射- 嵌套结果映射 –
case
也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
- 嵌套结果映射 –
一对一
案例: 查询用户所属部门
pojo
public class User {
public User() {}
/**
* 用户id
*/
private Integer userId;
/**
* 账号
*/
private String username;
/**
* 部门id
*/
private Integer deptId;
/**
* 部门
*/
private Dept dept;
//省略get set toString
}
public class Dept {
public Dept() {}
//部门id
private Integer deptId;
//部门名称
private String deptName;
//父级id
private Integer parentId;
//省略get set toString
}
dao
User findById(@Param("userId") Integer userId);
xml
<resultMap id="userMap" type="com.learn.User">
<id column="user_id" property="userId"></id>
<result column="username" property="username"></result>
<association property="dept" column="dept_id" javaType="com.learn.Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<result column="parent_id" property="parentId"></result>
</association>
</resultMap>
<select id="findById" resultMap="userMap">
select t.user_id, t.username, t2.dept_id, t2.dept_name, t2.parent_id
from t_user t
inner join t_dept t2 on t.dept_id = t2.dept_id
where t.user_id = #{userId}
</select>
一对多
案例:查询当前部门的用户
pojo
跟一对一实体差不多,就是我们需要在Dept部门实体类中,定义一个用户集合
//用户集合属性
List<User> users;
dao
Dept findById(@Param("deptId") Integer deptId);
xml
<resultMap id="deptMap" type="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<result column="parent_id" property="parentId"></result>
<collection property="users" ofType="User">
<id column="user_id" property="userId"></id>
<result column="username" property="username"></result>
<result column="dept_id" property="deptId"></result>
</collection>
</resultMap>
<select id="findById" resultMap="deptMap">
select t.dept_id, t.dept_name, t.parent_id, s.user_id, s.username
from t_dept t inner join t_user s on t.dept_id = s.dept_id
where t.dept_id = #{deptId}
</select>
多对多
多对多是一对多的特例,比如用户和角色
public class User{
//1个用户多个角色
List<Role> roles;
}
public class Role{
//1个角色被多个用户使用
List<User> users;
}