您现在的位置是:首页 > 后台技术 > MyBatisMyBatis

MyBatis高级查询(第六章)(图文)

第十三双眼睛2020-08-03【MyBatis】人已围观

简介通过前面几章的学习,我们已经了解了MyBatis中最常用的部分,基本的增删改查操作以及动态SQL已经可以满足我们的大部分需求,这一章将会对上述内容之外的知识点进行详细介绍。主要处理一对一,一对多的查询,另外就是在MyBatis中使用存储过程的方法,处理存储过程的入参和出参方法,最后会介绍java中的枚举方法和数据库表字段的处理方法。

高级结果映射
在关系型数据库中,我们经常需要处理一对一,一对多的关系,例如,一个汽车需要有一个引擎,这是一对一的关系,一辆汽车有多个轮子,这是一对多的关系。
在RBAC权限系统中还存在着一个用户拥有多个角色,一个角色拥有多个权限这样复杂的嵌套关系。使用已经学会的MyBatis技巧可以轻松的解决这些复杂的关系。在面对这种关系的时候,我们可能需要写多个方法分别查询这些数据,然后组合到一起,这种处理方法特别适合用在大型的系统上,由于分库分表,这种用法可以减少表之间的关联查询,方便系统进行扩展。但是在一般的企业应用中,使用MyBatis的高级结果映射便可以轻松的处理这种一对一,一对多的关系。

一对一映射
假设在RBAC的权限系如中,一个用户只能有一个角色,为了举例,先把用户和角色之间的关系限制为一对一的关系,一对一映射不需要考虑是否存在重复数据,因此使用起来很简单,而且可以直接使用MyBatis的自动映射。
使用自动映射就是通过别名让MyBatis自动将值匹配到对应的字段上,简单的别名映射如user_name对应userName,除此之外,MyBatis还支持复杂的映射,可以嵌套多层,例如将role.role_name映射到role.roleName上,MyBatis会先查找role属性,如果存在role属性就创建role对象,然后在role对象中继续查找roleName,将role_name的值绑定到role对象的roleName属性上。

使用resultMap配置一对应映射
除了使用MyBatis的自动映射来处理一对一的嵌套外,还可以在xml配置文件中配置结果映射,注意这种方式时,返回值不能使用resultType,而是要用resultMap,并将其值设置为resultMap的id.

使用resultMap的association标签配置一对一映射。
在resultMap中,association标签用于和一个复杂的类型进行关联,即用于一对一关联配置。association标签包含以下属性:
property:指定实体类中的属性名
javaType:属性对应的java类型
resultMap:可以直接使用现有的resultMap,而不用在这配置
columnPrefix:查询列的前缀,配置前缀后,在子标签配置的result的column时可以省略前缀
除了这些属性,还有其他属性,此处不做介绍。
因为配置了role,因此在association内部配置的result的property属性时,直接按照sysRole对象中的属性名配置即可,另外还配置了columnPrefix,在写SQL的时候,和sys_role表相关的查询列的别名都要有role_前缀,在内部result配置column时,需要配置成去掉前缀的列名,MyBatis在映射结果集合时会自动使用前缀和column值的组合去SQL查询结果中取值,这种配置方式实际上时很方便的。

除了前面的几种情况,还可以利用简单的SQL通过多次查询转换为我们需要的结果,这种方式与根据业务逻辑手动执行多次SQL的方式很像,最后会直接将结果组合成一个对象。
association标签的嵌套查询常用的属性如下:
select:另一个查询的id,MyBatis会额外执行这个查询获取嵌套对象的结果
column:列名,将主查询中列的结果作为查询的参数,配置方式如column={prop1=column1,prop2=column2},prop1和prop2将会作为嵌套查询的参数。
fetchType:数据加载的方式,可选值为lazy和eager,分别为延迟加载和积极加载,这个配置会覆盖全局的lazyLoadingEnabled配置。

一对多映射
一对多映射只有两种方式配置,都是用collection来进行的。
collection集合的嵌套结果映射,和association类似,集合的嵌套结果就是值通过一次SQL查询将所有的结果查询出来,然后通过配置的结果映射,将数据映射到不同的对象中去,在一对多的关系中,主表的一条数据会对应关联表的多条数据,因此一般查询时会查询出多个结果,按照一对一的数据结构存储数据的时候,最终的结果数会小于等于查询的总记录数,
在RBAC的权限系统中,一个用户拥有多个角色,每个角色又是多个权限的集合,所以要渐进式的去实现一个SQL查询出所有用户的用户拥有的角色,以及角色所包含的所有权信息的两层嵌套结果。在配置的时候,只需要把之前的association改成collection,property改成属性名.







 

Tags:

很赞哦! ()

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

本站推荐

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计242篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们