级联/嵌套查询

news2024/9/26 3:27:17

在真实业务背景中的系统中,对于用户的认证、授权以及鉴权的问题,通常不只依靠一张用户表来完成。一般还涉及用户角色表,用户-角色关系表,权限表,以及角色-权限关系表。此时查询数据库,除了使用关联查询还有一种方式,级联查询,也是这篇博客的主题。

级联查询也叫嵌套查询,在sql中,一个SELECT-FROM-WHERE语句成为一个查询语句块,那么将一个语句块嵌套在另一个语句块的WHERE字句的条件中的查询称为嵌套查询,下文将通过上述讲述的五表案例来具体描述。

构建数据库表

1.用户基本信息表

该表中共有4个字段,如下图所示,其中盐值是使用SHA加密算法生成的随机串。

 2.角色表

用于描述一组权限的集合。

 3.用户角色关系表

记录用户所对应的角色,其中一个用户可以有多个角色,一个角色也可以被多个用户持有。

4.权限表

描述使用系统功能所需要的权限

5.权限-角色关系表

用于描述角色权限之间的对应关系,其中一个角色可以对应多个权限,一个权限也可以为多个角色持有

 构建实体类

实体类包含用户类、权限类以及角色类,其中 用户类中包含一个HashSet类型的属性用于存放角色集合,角色类中包含一个HashSet类型的属性用于存放权限。

查询数据库

1.分析一下

在这里,无论是查询数据库还是封装结果集都基于注解的方式进行。首先分析一下:

在根据用户唯一标时Id查询用户详细信息时,需要封装一个roles属性,这个属性详细信息查询是一定要经过角色表的。在查询的时候也不能盲目的查,一定是有条件的,这个条件就是我们要查那个用户的详细信息,就要查这个用户所对应的角色有哪些。所以这个时候就需要根据用户-角色关系表找到二者的对应关系。对于角色属性中的权限属性也是一样的,不再赘述。

2.实现

首先是UserDao中的根据用户id查询用户详细信息

    @Select("select * from pe_user where id=#{id}")
    @Results({
            @Result(column = "id",property ="id" ),
            @Result(column = "username",property ="username" ),
            @Result(column = "password",property ="password" ),
            @Result(column = "salt",property ="salt" ),
            @Result(column = "id",property ="roles",many = @Many(select = "com.my.springsecurity3.dao.RoleDao.findRoleByUserId"))
    })
    User findUserDetailById(Integer id);

对于上述代码有这样几个点需要注意一下:

1.这里使用@Results注解封装结果集,其中一个@Result注解代表一个字段,该注解中的column属性对应表中的字段,而property属性对应实体类中的字段。

2.对于最后一个属性roles,它所对应的@result注解中的column代表将要调用方法要传下去的参数是表中字段为id的值。也就是说我们在调用RoleDao中的方法封装该字段的值时,需要将该用户的id传下去,用以查询。

3.最后一个@Result中的many属性,它主要用于多对多的关联查询,相当于xml文件中封装结果集时使用collection标签。

其次是RoleDao中的根据用户id查询用户详细信息

  @Select("select * from pe_role where id in((select role_id from pe_user_role where user_id=#{userId}))")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "description",property = "description"),
            @Result(column = "id",property = "permissions"
                    ,many = @Many(select = "com.my.springsecurity3.dao.PermissionDao.findPermissionByRoleId")),

    })
    List<Role> findRoleByUserId(Integer userId);

 翻译一下上面的sql查询语句:

从pe_role表中查询一个id(这里的id是角色表的id)在某个范围内的所有数据,这个某个范围是指从用户角色关系表中根据用户id查到的一组role_id。

最后是PermissionDao中的根据用户id查询用户详细信息

 @Select("select * from pe_permission where id in((select permission_id from pe_role_permission where role_id=#{roleId}))")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "name", property = "name"),
            @Result(column = "code", property = "code"),
            @Result(column = "description", property = "description")
    })
    List<Permission> findPermissionByRoleId(Integer roleId);

测试一下

    @Test
    public void testSelect(){
        User userDetail = userDao.findUserDetailById(2);
        System.out.println(userDetail);
    }

 运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍

上篇我们介绍了Function页的内容,这篇我们介绍Inports和Outports页的内容,这里我们再次强调一个概念,code mapping是以simulink的角度去看的,就是先要在模型中建立simulink模块,在code mapping里映射他要对应的autosar的元素,之后生成代码时的c语言的名字是以Autosar的元…

面试3个月72次全挂,程序员晒凄惨经历,网友:是个狠人

说起面试&#xff0c;对于大多数求职者来说&#xff0c;找到一份真正合适工作的过程&#xff0c;无疑就是一场不断患得患失的煎熬之旅。 为什么这么说呢&#xff1f;因为找工作的漫长过程&#xff0c;不仅需要很大的体力消耗&#xff0c;给心理带来的巨大负担也是让很多人感到…

SRv6 BE实验

以上内容均属原创&#xff0c;如有不详或错误&#xff0c;敬请指出。本文作者&#xff1a; 坏坏 本文链接&#xff1a; http://t.csdn.cn/Q6VaU 版权声明&#xff1a; 本博客所有文章除特别声明外&#xff0c;如需转载&#xff0c;请联系作者注明出处并附带本文链接&#xf…

蓝海创意云×悦乐兔99艺术节直播首秀顺利开播

8月18日&#xff0c;苏州悦乐兔99艺术节直播首秀顺利开播&#xff0c;蓝海创意云为此次直播提供了全程技术支持&#xff0c;使用自主研发的vLive虚拟直播系统嵌入整个直播流程&#xff0c;带给观众一场不一样的全新视觉体验。 蓝海创意云x悦乐兔直播首秀顺利开播 蓝海创意云助力…

计算机竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

根据源码,模拟实现 RabbitMQ - 转发规则实现(6)

目录 一、转发规则实现 1.1、需求分析 1.2、实现 Router 转发规则 1.2.1、bindingKey 和 routingKey 参数校验 1.2.2、消息匹配规则 1.2.3、主题交换机匹配规则 一、转发规则实现 1.1、需求分析 这里主要实现 routingKey 和 bindingKey 参数的校验&#xff0c;以及 Topic…

邀请函 | 高质量区块链·元宇宙—标准行系列沙龙(北京站)即将开启

区块链、元宇宙是近年来备受关注的新兴技术&#xff0c;也是推动数字经济发展的重要力量。高质量标准引领高质量发展&#xff0c;加快形成标准引领&#xff0c;充分释放区块链、元宇宙对实体经济牵引赋能效应&#xff0c;推进形成相关产业体系高质量发展新格局刻不容缓。 为进…

AIGC|万字长文!带你了解AI大模型技术演进

一、AI的起源 在下面这张图中&#xff0c;我们可以看到两个人物&#xff1a;图中左边的人物是一位演员&#xff0c;他出演了一部名为《模仿游戏》的电影。而这部电影实际上讲述的是图中右边的人物&#xff0c;他就是是人工智能之父图灵&#xff08;Alan Turing&#xff09;。 …

Python可视化在量化交易中的应用(17)_Seaborn核密度曲线图

Seaborn中核密度图的绘制方法 seaborn中绘制核密度图使用的是sns.kdeplot()函数&#xff1a; sns.kdeplot(x,y,shade,vertical,kernel,bw,gridsize200,cut3,clip,legend,cumulative,shade_lowest,cbar,cbar_ax,cbar_kws,ax,weights,hue,palette,hue_order,hue_norm,multiple‘…

做好产品设计应遵循的5大原则

产品设计原则是产品设计需遵循的基础规则&#xff0c;如果没有遵循设计原则&#xff0c;直接进行产品设计&#xff0c;往往会造成产品设计不稳定、冗杂&#xff0c;不能真正满足用户需求&#xff0c;这为项目带来较大风险&#xff0c;影响项目顺利交付。 一般来说&#xff0c;做…

【实用工具】ScreenToGif 制作GIF

1、介绍 官方地址 ScreenToGif是一款优秀的录屏软件&#xff0c;可将屏幕上的软件操作、会议视频、视频聊天等录制为GIF或MP4格式的文件。 ScreenToGif的启动界面包含屏幕录像机、电脑摄像头录制、画板录制和编辑器4个功能。启动录像机功能后&#xff0c;会有一个录制窗口&am…

【Axure高保真原型】通过输入框动态控制折线图

今天和大家分享通过输入框动态控制折线图的原型模板&#xff0c;在输入框里维护项目数据&#xff0c;可以自动生成对应的折线图&#xff0c;鼠标移入对应折点&#xff0c;可以查看对应数据。使用也非常方便&#xff0c;只需要修改输入框里的数据&#xff0c;或者复制粘贴文本&a…

Docker容器与虚拟化技术:Docker-Compose

目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 一、理论 1.Docker-Compose &#xff08;1&#xff09;使用场景…

【Linux】进程间通信之信号机制2

文章目录 信号阻塞代码验证验证信号的阻塞验证信号的阻塞不影响信号注册验证可靠信号不会丢信号&#xff0c;不可靠信号会丢信号验证9号和19号信号不能被阻塞 用信号解决僵尸进程volatile关键字 信号阻塞代码验证 在上篇详解信号机制的博文中&#xff0c;我们提到了设置阻塞位…

RISC-V公测平台发布 · 数据库在RISC-V服务器上的适配评估

前言 上一期讲到YCSB在RISC-V服务器上对MySQL进行性能测试&#xff08;RISC-V公测平台发布 使用YCSB测试SG2042上的MySQL性能&#xff09;&#xff0c;在这一期文章中&#xff0c;我们继续深入讨论RISC-V数据库的应用。本期就继续利用HS-2平台来测试数据库软件在RISC-V服务器…

基于PaddlePaddle实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

❤echarts折线图完整使用及详细配置参数

❤echarts折线图完整使用及详细配置参数 进入echarts官网 查看案例&#xff0c;下面说说一些echarts图的调节 一、配置echarts具体参数 01 基础版本的折线图 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data…

Charles通过逍遥模拟器抓包APP,亲测可用

1.设置http代理. Proxy-->Proxy settings 2.设置ssl proxy-->ssl proxying settings 3.Charles安装证书 弹出证书安装界面,点击"安装证书" 选择当前用户, 选择: 将所有的证书都放入下列存储: 直接下一步,最后确定提示"导入成功" 4.接着设置Charles安…

年薪47500美元|眼科硕士赴弗吉尼亚大学从事博士后研究

K医生只有医学硕士学位&#xff0c;起初只考虑申请访问学者&#xff0c;最终我们为其争取到“Post-Doctoral Research Associate”&#xff08;博士后研究助理&#xff09;职位&#xff0c;年薪47500美元&#xff0c;大大超出了本人的预期。 K医生背景&#xff1a; 申请类型&a…

提升管班小诀窍

在传统教育中&#xff0c;将考试结果告知家长一直是一项相对麻烦的任务。老师们不得不一个一个的打电话或发短信&#xff0c;耗费大量时间和精力。然而&#xff0c;现在有了易查分&#xff0c;老师们可以轻松地创建自己的成绩查询系统&#xff0c;大大简化了这项任务。 好消息&…