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

2022-08-29 10:45:33
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}

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

  • 作者:weixin_39880895
  • 原文链接:https://blog.csdn.net/weixin_39880895/article/details/111702452
    更新时间:2022-08-29 10:45:33