mysql用戶權限表join_MyBatis映射利用mysql left join 解決N+1查詢問題

1.權限是幾乎每個系統都需要的

2.一般在用戶請求某個url的時候,都需要驗證用戶是否擁有該url的訪問權限

3.最簡單的權限系統需要 用戶表,角色表,用戶角色表,權限表,角色權限表

f5a6123455c3b42b7ea9bd1c4a451caf.png

4bb9375a4068cea42ea14911ccfc80c3.png

fdcc89faa84ff56535eb5e154bbaec4e.png

c75fec7d8a03d2d9be6ad7c492b822e3.png

7fd0af4ce29c7f76a4d708a6dc8f39b4.png

f010e896aecb92037728df5905c66483.png

# Host: 127.0.0.1 (Version: 5.6.22)

# Date: 2015-04-09 10:52:58

# Generator: MySQL-Front 5.3 (Build 4.13)

/*!40101 SET NAMES utf8 */;

#

# Source for table "privilege"

#

CREATE TABLE `privilege` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

`url` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "privilege"

#

INSERT INTO `privilege` VALUES (1,'產品增加','/product/add'),(2,'產品刪除','/product/delete'),(3,'產品修改','/product/update'),(4,'產品查詢','/product/query');

#

# Source for table "role"

#

CREATE TABLE `role` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

#

# Data for table "role"

#

INSERT INTO `role` VALUES (1,'admin'),(2,'manager'),(3,'guest');

#

# Source for table "role_priv"

#

CREATE TABLE `role_priv` (

`role_id` int(11) NOT NULL,

`priv_id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "role_priv"

#

INSERT INTO `role_priv` VALUES (1,1),(2,1),(1,3);

#

# Source for table "user"

#

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

#

# Data for table "user"

#

INSERT INTO `user` VALUES (1,'jack'),(2,'jaychang'),(3,'jasaon'),(4,'lucy'),(5,'marry');

#

# Source for table "user_role"

#

CREATE TABLE `user_role` (

`user_id` int(11) NOT NULL DEFAULT '0',

`role_id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "user_role"

#

INSERT INTO `user_role` VALUES (1,1),(1,3),(3,2),(2,2);

4.表對應的實體類

放在了sample包下

public class Privilege {

private Integer id;

private String name;

private String url;

...省略get,set方法

}

public class User {

private Integer id;

private String name;

private List roles;

...省略get,set方法

}

public class Role {

private Integer id;

private String name;

private List privileges;

...省略get,set方法

}

5.mybatis配置文件

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

6.UserMapper.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select u.id as user_id,u.name as user_name,r.id as role_id,

r.name as role_name,p.id as priv_id,p.name as priv_name,p.url as priv_url

from user u

left join user_role ur on u.id = ur.user_id

left join role r on r.id = ur.role_id

left join role_priv rp on r.id = rp.role_id

left join privilege p on p.id = rp.priv_id

where u.id = #{id}

測試

List users = sqlSession.selectList("selectUserById", 1L);

for (User u : users) {

System.out.println("用戶名:" + u.getName());

List roles = u.getRoles();

if (null != roles) {

for (Role role : roles) {

System.out.println(" 擁有角色:" + role.getName());

List privs = role.getPrivileges();

if (null != privs && privs.size() > 0) {

System.out.println(" 該角色【" + role.getName()

+ "】,擁有的權限:");

for (Privilege priv : privs) {

System.out.println(" " + priv.getName()

+ "," + priv.getUrl());

}

}

}

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529404.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 爬取貝殼網小區名稱_如何使用 python 爬取全國小區名稱

前言筆者在做一個 NLPNLPNLP 項目時,需要識別小區名,因此想要查詢網上是否有相關的數據集。經過一番搜索后一無所獲…從而決定自己來爬取這份數據。由于爬取網站的內容信息之后可能會發生變更,因此此處給出具體的爬蟲思路,便于應對…

mysql hint 簡書_MySQL

為滿足不同數據庫設計要求,減少數據冗余而指定設計規范,可稱為數據庫范式數據庫范式呈遞次規范,即高階范式必然滿足低階范式越高的數據庫范式意味著越嚴格的設計要求,同時數據冗余越小第一范式(1NF):數據庫表的每一列都…

python獲取手機通知欄消息_Python編寫簡單的通知欄腳本啟動工具

隨著自己編寫的腳本與安裝的工具越來越多,電腦的桌面和文件夾也越來越亂了。就在前幾天因為一個不小心,我把自己的一個項目給刪了,所以決定將電腦整理一下。不過這一整理我很多腳本和工具的位置我就忘記了,所以決定寫個小工具來快速啟動一些常用的腳本或工具這里選擇Python是因…

java 圓 繼承_java 類的繼承(轉)

這個星期主要是學習了Java中類的繼承問題.繼承就是由已有的類創建新類,通過子類繼承父類的方法,實現一些功能.下面就是老師布置作業的其中一個:定義父類圓,通過繼承,獲得子類球、圓錐、圓柱,子類具有計算體積的功能。1)新建文件夾Test1&#…

java爬蟲 京東_Java爬蟲實現京東物流查詢

網上沒有免費的接口,只能自己寫一套了,參考代碼如下public static JSONObject getLastInfo(String no){JSONObject jsonObjectnew JSONObject();jsonObject.put("no", no);Connection connectionJsoup.connect("http://www.jdwl.com/orde…

java list stream avg_Java 8 Stream API中的多個聚合函數

要在沒有自定義收集器的情況下執行此操作(不再對結果進行流式傳輸),您可以這樣做.它有點臟,因為它首先收集到Map< String,List< TimePeriodCalc>>然后流式傳輸該列表并獲得平均加倍.由于你需要兩個平均值,它們被收集到一個Holder或一對,在這種情況下我使用的是Abst…

java 發送郵件昵稱_利用JavaMail發送QQ郵件

一、RFC882文檔簡單說明RFC882文檔規定了如何編寫一封簡單的郵件(純文本郵件)&#xff0c;一封簡單的郵件包含郵件頭和郵件體兩個部分&#xff0c;郵件頭和郵件體之間使用空行分隔。郵件頭包含的內容有&#xff1a;from字段   --用于指明發件人to字段    --用于指明收件…

java沒有timer類_Java中的Java.util.Timer類 - Break易站

scheduleAtFixedRate(TimerTask task, long delay, long period): java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)在指定的延遲語法后開始&#xff0c;為重復的固定速率執行調度指定的任務&#xff1a;public void scheduleAtFixedRate(TimerT…

java select下拉標簽_java中下拉框select和單選按鈕的回顯操作

前提&#xff1a;1.下拉框select請選擇部門selected"selected">${department.department}2.單選按鈕radio的回顯checked"checked">checked"checked">補充知識&#xff1a;java使用apache commons-fileupload組件實現文件上傳(控制文件上…

java 訪問控制權限_Java訪問控制權限有哪些?區別是什么?

原標題&#xff1a;Java訪問控制權限有哪些&#xff1f;區別是什么?Java中的類和方法等都是有訪問控制權限的&#xff0c;用來控制方法、類、屬性等的生效范圍&#xff0c;Java有四種訪問控制權限&#xff0c;其中比較常用的就是public和private&#xff0c;今天華清遠見Java學…

java 操作cursor數據庫_Java連接各種數據庫以及調用存儲過程

準備工作&#xff1a;1. 創建表drop table T_TEST_PROCEDURE cascade constraints;/**//*Table: T_TEST_PROCEDURE*//**/createtable T_TEST_PROCEDURE (IDNUMBER(19) not null,NAMEVARCHAR2(40),AGE NUMBER(3),constraintPK_T_TEST_PROCEDURE primary key (ID));2. 創建存儲過…

java 規格overview_《Java數據結構和算法》- OverView

Q: 不同數據結構的優缺點&#xff1f;數據結構優點缺點數組(Array)快速訪問&#xff0c;如果知道下標&#xff0c;就可以非常快地存取查找慢&#xff0c; 插入或刪除慢&#xff0c; 大小固定有序數組(OrderedArray)比無序的數組查找快插入或刪除慢&#xff0c;大小固定棧(Stack…

mysql 集群怎么卸載節點_Greenplum移除節點

基于某某原因&#xff0c;我們的Greenplum需要卸載一個節點(測試環境的Greenplum集群)&#xff0c;由于該集群使用了很久&#xff0c;里面有許多開發所需要的數據&#xff0c;所以在卸掉一個節點后&#xff0c;還要保證數據不會丟失。當然&#xff0c;期間也遇到了點問題&#…

mysql2012更改表名_T-SQL入門攻略之13-修改數據表

--> Title : T-SQL入門攻略之13-修改數據表--> Author : wufeng4552--> Date : 2010-07-12修改表名與字段名—sp_rename--1修改表名SQL Server不直接提供修改表名的T-SQL語句&#xff0c;但是可以通過存儲過程實現語法格式&#xff1a;sp_rename tablename,newtabl…

python中不論類的名字是什么歌_Python自動猜歌名,還愁排名上不去嘛?

前言相傳&#xff0c;就在前幾日&#xff0c;在網上閑逛時&#xff0c;刷到了一個猜歌的小程序。這個小程序通過播放歌曲部分片段&#xff0c;然后讓用戶來猜它的歌名&#xff0c;大概是這樣的&#xff1a;作為一個腦熱的聽歌愛好者&#xff0c;于是他越陷越深&#xff0c;越刷…

java調用oracle存儲過程_做一點,記一點 ~ Java調用Oracle存儲過程

一、需求傳入一個參數&#xff0c;返回一條或多條記錄(列表)。二、實現步驟1. 編寫Oracle存儲過程。-- 聲明包和包體的語句應該分兩次執行&#xff0c;即使聲明在前定義在后&#xff0c;如果一起執行依然會編譯出錯--調用能夠返回多條記錄的存儲過程需要定義在包內--聲明包及包…

java 從控制臺讀取_轉載 java從控制臺讀取輸入的方法

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class MainClass { public static void method1() { //使用Scanner Scanner scannernew Sca…

trace java_使用java動態字節碼技術簡單實現arthas的trace功能。

參考資料用過[Arthas]的都知道&#xff0c;Arthas是alibaba開源的一個非常強大的Java診斷工具。不管是線上還是線下&#xff0c;我們都可以用Arthas分析程序的線程狀態、查看jvm的實時運行狀態、打印方法的出入參和返回類型、收集方法中每個代碼塊耗時&#xff0c;甚至可以監控…

順時針小球圓周運動Java編程_如何使用CSS實現圓周運動小球的實例

我們時常在頁面中見到一些動畫效果&#xff0c;這些動畫效果&#xff0c;很多可以僅通過CSS來實現。在這里我們用到了CSS3的animation屬性。animation 屬性是一個簡寫屬性&#xff0c;用于設置六個動畫屬性&#xff1a;animation-name 規定需要綁定到選擇器的 keyframe 名稱。a…

java swing 外觀框架_【GUI】一、Swing外觀框架BeautyEye使用

一、Swing外觀框架BeautyEye使用1.1 導包1.2 使用BeautyEye L&Fpublic static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {// 國人牛逼主題&#xff0c;值得學習// 初始化字體InitGlobalFont(new Font("微軟雅黑", F…