mybatis 忽略字段_小何技术分享,java框架之mybatis (二)

f62c288e71adb44da5143e574534e0d3.png

MyBatis关系映射

数据库关系一直是最复杂最难理清的一部分了。也是orm框架学习的重点。

1、一对一关系、多对一关系

比如用户和部门关系,一个用户只属于一个部门。

首先定义值对象(省略set、get方法),在值对象中包含另一个值对象,如UserDept中包含了Dept对象:

 public class UserDept { private Integer id; private String username; private String password; private Dept dept; }

映射文件中用resultMap来修饰结果集,对以下关键字进行说明:

  • association标记对:来表示一对一映射关系
  • property="dept":指定映射对应的对象,"dept"就是UserDept中的字段名
  • select="com.dao.SysDeptDao.findById":表示数据源,通过另一个检索来取得数据,命名空间 + id的形式。
  • column="deptId":是给从另一个检索传递的参数。(多个参数形式下面会提到)
  select * from sys_users 

在select语句中指定这个resultMap,这样检索出来就自动填充了Dept中的字段,还有一种方法就是继承resultMap,这种方法在一对多关系中举例。

2、一对多关系

例如订单和订单商品,就是一对一关系。

假设Order中包含了一个List对象。其他字段就忽略了

先定义resultMap叫做orderRM,然后再定义一个orderDetailRM来继承orderRM,然后在此resultMap中定义collection标记对,相对于association标记对,它是专门用来修饰一对多关系的。property属性用法一样,ofType是指定映射对象的类型。在collection标记之间,可以写入映射字段(主键用id,普通字段用result标记)

…………select …

需要注意一点,是两个resultMap中不能有重名的字段,如果命名重复,在Sql句中另起别名,比如OrderDetail中也有id字段,Sql句中把它as 成 d_id。这样检索出来会自动填充List对象

3、递归关系

比如角色和权限的关系,权限是一个树形结构,值对象定义如下:

public class MenuTree {private Integer id;private String name;private Integer parentId;private List childs;}

mapper文件中查询语句先检索出所有的顶级树。

selectid,name,parent_id,#{roleId} as role_idfromtb_auth_menuwhereparent_id = 0

然后在定义resultMap中加入collection标记对,用select属性进行查询,column用来传递参数,为了看清形参和实参,特意用p_role_id和role_id来区分。

再为select查询定义一个查询,用来递归。如果在同一个mapper文件中,就可以直接用id来指定查询语句,如:select="selectChilds"

selectid,name,parent_id,#{p_role_id} as role_idfromtb_auth_menuwhereparent_id = #{id}

这样检索出来的效果就是,角色和权限树。然后可以通过角色和权限的关系来匹配角色是否授权,非常简单就是添加一个字段和一个查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值