MyBatis高级映射

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值