1、問題描述
今天做數據報表的時候,不想使用java
代碼做各種組合了,直接在MySQL
裏面搞級聯查詢,但是遇到了很多問題,在這裏記錄一下,防止後來的人踩坑。首先搭建一下環境,如果有人想學習,也可以直接拷貝代碼運行即可。
2、工程源碼
A、首先是數據庫部分
sql
create database mango;
use mango;
CREATE TABLE `sys_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
`name` varchar(100) DEFAULT NULL COMMENT '角色名稱',
`remark` varchar(100) DEFAULT NULL COMMENT '備註',
`create_by` varchar(50) DEFAULT NULL COMMENT '創建人',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`last_update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime DEFAULT NULL COMMENT '更新時間',
`del_flag` tinyint(4) DEFAULT '0' COMMENT '是否刪除 -1:已刪除 0:正常',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='角色管理'
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
`name` varchar(50) NOT NULL COMMENT '用戶名',
`nick_name` varchar(150) DEFAULT NULL COMMENT '暱稱',
`avatar` varchar(150) DEFAULT NULL COMMENT '頭像',
`password` varchar(100) DEFAULT NULL COMMENT '密碼',
`salt` varchar(40) DEFAULT NULL COMMENT '加密鹽',
`email` varchar(100) DEFAULT NULL COMMENT '郵箱',
`mobile` varchar(100) DEFAULT NULL COMMENT '手機號',
`status` tinyint(4) DEFAULT NULL COMMENT '狀態 0:禁用 1:正常',
`dept_id` bigint(20) DEFAULT NULL COMMENT '機構ID',
`create_by` varchar(50) DEFAULT NULL COMMENT '創建人',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`last_update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime DEFAULT NULL COMMENT '更新時間',
`del_flag` tinyint(4) DEFAULT '0' COMMENT '是否刪除 -1:已刪除 0:正常',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COMMENT='用戶管理'
CREATE TABLE `sys_user_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
`user_id` bigint(20) DEFAULT NULL COMMENT '用戶ID',
`role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',
`create_by` varchar(50) DEFAULT NULL COMMENT '創建人',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`last_update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime DEFAULT NULL COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8 COMMENT='用戶角色'
CREATE TABLE `sys_dept` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
`name` varchar(50) DEFAULT NULL COMMENT '機構名稱',
`parent_id` bigint(20) DEFAULT NULL COMMENT '上級機構ID,一級機構爲0',
`order_num` int(11) DEFAULT NULL COMMENT '排序',
`create_by` varchar(50) DEFAULT NULL COMMENT '創建人',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`last_update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime DEFAULT NULL COMMENT '更新時間',
`del_flag` tinyint(4) DEFAULT '0' COMMENT '是否刪除 -1:已刪除 0:正常',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='機構管理'
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (1, 1, 1, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (2, 2, 1, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (26, 5, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (33, 6, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (34, 4, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (35, 9, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (36, 10, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (37, 11, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (38, 12, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (39, 15, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (41, 16, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (42, 8, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (43, 7, 4, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (45, 18, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (46, 17, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (47, 3, 4, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (48, 21, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (57, 31, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (58, 30, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (59, 32, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (73, 33, 8, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (74, 25, 8, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (75, 25, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (80, 22, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (81, 23, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (82, 24, 4, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (83, 26, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (85, 29, 2, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (86, 28, 4, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (87, 27, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (88, 39, 4, NULL, NULL, NULL, NULL);
INSERT INTO `sys_user_role`(`id`, `user_id`, `role_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`) VALUES (89, 39, 3, NULL, NULL, NULL, NULL);
INSERT INTO `sys_role`(`id`, `name`, `remark`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (1, 'admin', '超級管理員', 'admin', '2019-01-19 11:11:11', 'admin', '2019-01-19 19:07:18', 0);
INSERT INTO `sys_role`(`id`, `name`, `remark`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (2, 'mng', '項目經理', 'admin', '2019-01-19 11:11:11', 'admin', '2019-01-19 11:39:28', 0);
INSERT INTO `sys_role`(`id`, `name`, `remark`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (3, 'chenwei', '陳偉', 'admin', '2020-05-07 15:52:53', 'admin', '2020-05-07 15:52:59', 0);
INSERT INTO `sys_role`(`id`, `name`, `remark`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (4, 'test', '測試人員', 'admin', '2019-01-19 11:11:11', 'admin', '2019-01-19 11:11:11', 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (1, '輕塵集團', NULL, 0, 'admin', '2018-09-23 19:35:22', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (2, '牧塵集團', NULL, 1, 'admin', '2018-09-23 19:35:55', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (3, '三國集團', NULL, 2, 'admin', '2018-09-23 19:36:24', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (4, '上海分公司', 2, 0, 'admin', '2018-09-23 19:37:03', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (5, '北京分公司', 1, 1, 'admin', '2018-09-23 19:37:17', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (6, '北京分公司', 2, 1, 'admin', '2018-09-23 19:37:28', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (7, '技術部', 5, 0, 'admin', '2018-09-23 19:38:00', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (8, '技術部', 4, 0, 'admin', '2018-09-23 19:38:10', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (9, '技術部', 6, 0, 'admin', '2018-09-23 19:38:17', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (10, '市場部', 5, 0, 'admin', '2018-09-23 19:38:45', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (11, '市場部', 6, 0, 'admin', '2018-09-23 19:39:01', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (12, '魏國', 3, 0, 'admin', '2018-09-23 19:40:42', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (13, '蜀國', 3, 1, 'admin', '2018-09-23 19:40:54', NULL, NULL, 0);
INSERT INTO `sys_dept`(`id`, `name`, `parent_id`, `order_num`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (14, '吳國', 3, 2, 'admin', '2018-09-23 19:41:04', NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (1, 'admin', '字節跳動萬歲', NULL, 'bd1718f058d8a02468134432b8656a86', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13612345678', 1, 4, 'admin', '2018-08-14 11:11:11', 'admin', '2018-08-14 11:11:11', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (22, 'liubei', '劉備', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 7, 'admin', '2018-09-23 19:43:00', 'admin', '2019-01-10 11:41:13', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (23, 'zhaoyun', '趙雲', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 7, 'admin', '2018-09-23 19:43:44', 'admin', '2018-09-23 19:43:52', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (24, 'zhugeliang', '諸葛亮', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 7, 11, 'admin', '2018-09-23 19:44:23', 'admin', '2018-09-23 19:44:29', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (25, 'caocao', '曹操', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 8, 'admin', '2018-09-23 19:45:32', 'admin', '2019-01-10 17:59:14', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (26, 'dianwei', '典韋', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 10, 'admin', '2018-09-23 19:45:48', 'admin', '2018-09-23 19:45:57', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (27, 'xiahoudun', '夏侯惇', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 8, 'admin', '2018-09-23 19:46:09', 'admin', '2018-09-23 19:46:17', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (28, 'xunyu', '荀彧', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 10, 'admin', '2018-09-23 19:46:38', 'admin', '2018-11-04 15:33:17', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (29, 'sunquan', '孫權', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 10, 'admin', '2018-09-23 19:46:54', 'admin', '2018-09-23 19:47:03', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (30, 'zhouyu', '周瑜', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 11, 'admin', '2018-09-23 19:47:28', 'admin', '2018-09-23 19:48:04', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (31, 'luxun', '陸遜', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 11, 'admin', '2018-09-23 19:47:44', 'admin', '2018-09-23 19:47:58', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (32, 'huanggai', '黃蓋', NULL, 'fd80ebd493a655608dc893a9f897d845', 'YzcmCZNvbXocrsz9dm8e', '[email protected]', '13889700023', 1, 11, 'admin', '2018-09-23 19:48:38', 'admin', '2018-09-23 19:49:02', 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (33, 'zhangsan', '張三', NULL, NULL, NULL, '[email protected]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (34, 'zhangsan1', '張三1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (35, 'zhangsan2', '張三2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (37, 'zhangsan3', '張三3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (38, 'zhangsan4', '張三4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_user`(`id`, `name`, `nick_name`, `avatar`, `password`, `salt`, `email`, `mobile`, `status`, `dept_id`, `create_by`, `create_time`, `last_update_by`, `last_update_time`, `del_flag`) VALUES (39, 'zhangsan5', '張三5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
這裏有四個表,說明一下:sys_user
和sys_dept
是多對一關係,sys_role
和sys_user
是多對一關係。sys_user_role
是sys_user
和sys_role
的關聯表,這裏主要是之前想在java
代碼裏面操作的時候建立的第三方表,如果直接使用MySQL
級聯查詢,感覺這個是多餘的(而且是副作用,讀者可以自行體會,但是我們接下來把這個問題都解決了,其他都SO EASY!
)。
B、工程代碼
新建項目什麼的我就不演示了,需要的可以自行查閱相關資料。這裏直接給出源碼。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.edu.njust</groupId>
<artifactId>mango</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mango</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!--跳過測試-->
<skipTests>true</skipTests>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mapper 引入可以使用通用mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
<exclusions>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<artifactId>mybatis-spring</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
<!--pagehelper 引入分頁插件依賴的jar包-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<artifactId>mybatis-spring-boot-starter</artifactId>
<groupId>org.mybatis.spring.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!--日誌-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--引入分頁插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8005
logging:
config: classpath:log4j.properties
level:
dao: debug
org:
mybatis: debug
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/mango?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mango?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: root
filters: stat,wall,log4j,config
max-active: 100
initial-size: 1
max-wait: 60000
min-idle: 1
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: select 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-open-prepared-statements: 50
max-pool-prepared-statement-per-connection-size: 20
jackson:
default-property-inclusion: non_null
# 指定數據庫中表生成實體的路徑
mybatis:
type-aliases-package: cn.edu.njust.mango.entity
mapper-locations: classpath:mapper/*.xml
configuration:
# 輸出sql日誌信息
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#pagehelper
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params:
count: countSql
log4j.properties
#Console Log
log4j.rootLogger=INFO,console,debug,info,warn,error
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - %5p [%t] --- %c{1}: %m%n
#A1--Print log to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.Threshold=INFO
log4j.appender.info.File=${LOG_PATH}/${LOG_FILE}_info.log
log4j.appender.info.DatePattern='.'yyyy-MM-dd
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.Threshold=ERROR
log4j.appender.error.File=${LOG_PATH}/${LOG_FILE}_error.log
log4j.appender.error.DatePattern='.'yyyy-MM-dd
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.File=${LOG_PATH}/${LOG_FILE}_debug.log
log4j.appender.debug.DatePattern='.'yyyy-MM-dd
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=${LOG_PATTERN}
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.File=${LOG_PATH}/${LOG_FILE}_warn.log
log4j.appender.warn.DatePattern='.'yyyy-MM-dd
log4j.appender.warn.layout = org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=${LOG_PATTERN}
SysUser.java
package cn.edu.njust.mango.entity;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
/**
* 用戶管理(SysUser)實體類
*
* @author Chen
* @since 2020-05-06 15:24:25
*/
@Data
@ApiModel("用戶管理")
public class SysUser implements Serializable {
private static final long serialVersionUID = -44575028142368237L;
/**
* 編號
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 用戶名
*/
private String name;
/**
* 暱稱
*/
private String nickName;
/**
* 頭像
*/
private String avatar;
/**
* 密碼
*/
private String password;
/**
* 加密鹽
*/
private String salt;
/**
* 郵箱
*/
private String email;
/**
* 手機號
*/
private String mobile;
/**
* 狀態 0:禁用 1:正常
*/
private Object status;
/**
* 機構ID
*/
private Long deptId;
/**
* 創建人
*/
private String createBy;
/**
* 創建時間
*/
private Date createTime;
/**
* 更新人
*/
private String lastUpdateBy;
/**
* 更新時間
*/
private Date lastUpdateTime;
/**
* 是否刪除 -1:已刪除 0:正常
*/
private Object delFlag;
}
SysUserRole.java
package cn.edu.njust.mango.entity;
import java.util.Date;
import javax.persistence.GeneratedValue;
import java.io.Serializable;
import io.swagger.annotations.*;
import lombok.Data;
import javax.persistence.*;
/**
* 用戶角色(SysUserRole)實體類
*
* @author Chen
* @since 2020-05-06 15:24:25
*/
@Data
@ApiModel("用戶角色")
public class SysUserRole implements Serializable {
private static final long serialVersionUID = -48730270108013484L;
/**
* 編號
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 用戶ID
*/
private Long userId;
/**
* 角色ID
*/
private Long roleId;
/**
* 創建人
*/
private String createBy;
/**
* 創建時間
*/
private Date createTime;
/**
* 更新人
*/
private String lastUpdateBy;
/**
* 更新時間
*/
private Date lastUpdateTime;
}
SysRole.java
package cn.edu.njust.mango.entity;
import java.util.Date;
import javax.persistence.GeneratedValue;
import java.io.Serializable;
import io.swagger.annotations.*;
import lombok.Data;
import javax.persistence.*;
/**
* 角色管理(SysRole)實體類
*
* @author Chen
* @since 2020-05-06 15:24:25
*/
@Data
@ApiModel("角色管理")
public class SysRole implements Serializable {
private static final long serialVersionUID = -79886721138103042L;
/**
* 編號
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 角色名稱
*/
private String name;
/**
* 備註
*/
private String remark;
/**
* 創建人
*/
private String createBy;
/**
* 創建時間
*/
private Date createTime;
/**
* 更新人
*/
private String lastUpdateBy;
/**
* 更新時間
*/
private Date lastUpdateTime;
/**
* 是否刪除 -1:已刪除 0:正常
*/
private Object delFlag;
}
SysDept.java
package cn.edu.njust.mango.entity;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
/**
* 機構管理(SysDept)實體類
*
* @author Chen
* @since 2020-05-06 15:24:25
*/
@Data
@ApiModel("機構管理")
public class SysDept implements Serializable {
private static final long serialVersionUID = -50559626000073116L;
/**
* 編號
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 機構名稱
*/
private String name;
/**
* 上級機構ID,一級機構爲0
*/
private Long parentId;
/**
* 排序
*/
private Integer orderNum;
/**
* 創建人
*/
private String createBy;
/**
* 創建時間
*/
private Date createTime;
/**
* 更新人
*/
private String lastUpdateBy;
/**
* 更新時間
*/
private Date lastUpdateTime;
/**
* 是否刪除 -1:已刪除 0:正常
*/
private Object delFlag;
}
SysUserVO.java 這裏爲了不和單表操作相耦合,直接搞一個
VO
類,裏面存放多對一及一對多的數據。
package cn.edu.njust.mango.vo;
import cn.edu.njust.mango.entity.SysDept;
import cn.edu.njust.mango.entity.SysRole;
import cn.edu.njust.mango.entity.SysUser;
import lombok.Data;
import java.util.List;
/**
* @author Chen
* @version 1.0
* @date 2020/5/7 7:31
* @description:
*/
@Data
public class SysUserVO extends SysUser {
/**
* 非數據庫字段
*/
private SysDept dept;
/**
* 非數據庫字段
*/
private List<SysRole> roles;
}
SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.edu.njust.mango.mapper.SysUserMapper">
<resultMap type="cn.edu.njust.mango.entity.SysUser" id="SysUserMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
</resultMap>
<resultMap id="queryForListMap" type="cn.edu.njust.mango.vo.SysUserVO">
<id column="id" property="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
<association property="dept" javaType="cn.edu.njust.mango.entity.SysDept">
<id property="id" column="d_id" jdbcType="INTEGER"/>
<result property="name" column="d_name" jdbcType="VARCHAR"/>
<result property="parentId" column="d_parent_id" jdbcType="INTEGER"/>
<result property="orderNum" column="d_order_num" jdbcType="INTEGER"/>
<result property="createBy" column="d_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="d_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="d_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="d_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="d_del_flag" jdbcType="OTHER"/>
</association>
<collection property="roles" javaType="java.util.List" ofType="cn.edu.njust.mango.entity.SysRole">
<id column="role_id" property="id" jdbcType="INTEGER"/>
<result property="name" column="role_name" jdbcType="VARCHAR"/>
<result property="remark" column="role_remark" jdbcType="VARCHAR"/>
<result property="createBy" column="role_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="role_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="role_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="role_del_flag" jdbcType="OTHER"/>
</collection>
</resultMap>
<select id="getDept" resultType="cn.edu.njust.mango.entity.SysDept" parameterType="INTEGER">
SELECT
*
FROM sys_dept d
where id = #{dept_id}
</select>
<select id="queryAllByPageRequestAndConditionAndRoleAndDept" resultType="cn.edu.njust.mango.vo.SysUserVO">
SELECT
*
FROM
sys_user u
LEFT JOIN sys_user_role ru ON u.id = ru.user_id
LEFT JOIN sys_role r on r.id = ru.role_id
LEFT JOIN sys_dept d on d.id = u.dept_id
</select>
</mapper>
SysUserMapper.java
package cn.edu.njust.mango.mapper;
import cn.edu.njust.mango.base.mapper.IBaseMapper;
import cn.edu.njust.mango.entity.SysUser;
import cn.edu.njust.mango.pojo.PageRequest;
import cn.edu.njust.mango.vo.SysUserVO;
import java.util.List;
/**
* 用戶管理(SysUser)表數據庫訪問層
*
* @author Chen
* @since 2020-05-06 14:16:48
*/
public interface SysUserMapper extends IBaseMapper<SysUser> {
List<SysUserVO> queryAllByPageRequestAndConditionAndRoleAndDept(PageRequest pageRequest);
}
SysUserMapperTest1.java
package cn.edu.njust.mango.mapper;
import cn.edu.njust.mango.pojo.PageRequest;
import cn.edu.njust.mango.vo.SysUserVO;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* @author Chen
* @version 1.0
* @date 2020/5/7 15:34
* @description:
*/
@SpringBootTest
@RunWith(JUnit4.class)
class SysUserMapperTest1 {
@Autowired
private SysUserMapper sysUserMapper;
@Test
void queryAllByPageRequestAndConditionAndRoleAndDept() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPageSize(100);
List<SysUserVO> sysUserVOS = sysUserMapper.queryAllByPageRequestAndConditionAndRoleAndDept(pageRequest);
System.out.println(sysUserVOS);
}
}
3、問題解決
好了工程搭建完畢,我們開始跑程序了。爲了方便測試,我們打斷點查看數據。直接運行測試類。控制檯輸出如下:
我們在System.out.println(sysUserVOS);
處打斷點。
然後我們查看數據全是null
,難道是我們的多對一,一對多沒有設置成功?但是我們查看SQL
語句日誌,確實是執行了啊!
java
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@672d8370] will not be managed by Spring
==> Preparing: SELECT count(0) FROM sys_user u LEFT JOIN sys_user_role ru ON u.id = ru.user_id LEFT JOIN sys_role r ON r.id = ru.role_id LEFT JOIN sys_dept d ON d.id = u.dept_id
==> Parameters:
<== Columns: count(0)
<== Row: 20
<== Total: 1
==> Preparing: SELECT * FROM sys_user u LEFT JOIN sys_user_role ru ON u.id = ru.user_id LEFT JOIN sys_role r on r.id = ru.role_id LEFT JOIN sys_dept d on d.id = u.dept_id LIMIT ?
==> Parameters: 100(Integer)
<== Columns: id, name, nick_name, avatar, password, salt, email, mobile, status, dept_id, create_by, create_time, last_update_by, last_update_time, del_flag, id, user_id, role_id, create_by, create_time, last_update_by, last_update_time, id, name, remark, create_by, create_time, last_update_by, last_update_time, del_flag, id, name, parent_id, order_num, create_by, create_time, last_update_by, last_update_time, del_flag
<== Row: 1, admin, 字節跳動萬歲, null, bd1718f058d8a02468134432b8656a86, YzcmCZNvbXocrsz9dm8e, admin@qq.com, 13612345678, 1, 4, admin, 2018-08-14 11:11:11.0, admin, 2018-08-14 11:11:11.0, 0, 1, 1, 1, null, null, null, null, 1, admin, 超級管理員, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 19:07:18.0, 0, 4, 上海分公司, 2, 0, admin, 2018-09-23 19:37:03.0, null, null, 0
<== Row: 31, luxun, 陸遜, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 11, admin, 2018-09-23 19:47:44.0, admin, 2018-09-23 19:47:58.0, 0, 57, 31, 2, null, null, null, null, 2, mng, 項目經理, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:39:28.0, 0, 11, 市場部, 6, 0, admin, 2018-09-23 19:39:01.0, null, null, 0
<== Row: 30, zhouyu, 周瑜, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 11, admin, 2018-09-23 19:47:28.0, admin, 2018-09-23 19:48:04.0, 0, 58, 30, 2, null, null, null, null, 2, mng, 項目經理, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:39:28.0, 0, 11, 市場部, 6, 0, admin, 2018-09-23 19:39:01.0, null, null, 0
<== Row: 32, huanggai, 黃蓋, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 11, admin, 2018-09-23 19:48:38.0, admin, 2018-09-23 19:49:02.0, 0, 59, 32, 3, null, null, null, null, 3, chenwei, 陳偉, admin, 2020-05-07 15:52:53.0, admin, 2020-05-07 15:52:59.0, 0, 11, 市場部, 6, 0, admin, 2018-09-23 19:39:01.0, null, null, 0
<== Row: 33, zhangsan, 張三, null, null, null, 206@qq.com1, null, null, null, null, null, null, null, 0, 73, 33, 8, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null
<== Row: 25, caocao, 曹操, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 8, admin, 2018-09-23 19:45:32.0, admin, 2019-01-10 17:59:14.0, 0, 74, 25, 8, null, null, null, null, null, null, null, null, null, null, null, null, 8, 技術部, 4, 0, admin, 2018-09-23 19:38:10.0, null, null, 0
<== Row: 25, caocao, 曹操, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 8, admin, 2018-09-23 19:45:32.0, admin, 2019-01-10 17:59:14.0, 0, 75, 25, 2, null, null, null, null, 2, mng, 項目經理, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:39:28.0, 0, 8, 技術部, 4, 0, admin, 2018-09-23 19:38:10.0, null, null, 0
<== Row: 22, liubei, 劉備, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 7, admin, 2018-09-23 19:43:00.0, admin, 2019-01-10 11:41:13.0, 0, 80, 22, 2, null, null, null, null, 2, mng, 項目經理, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:39:28.0, 0, 7, 技術部, 5, 0, admin, 2018-09-23 19:38:00.0, null, null, 0
<== Row: 23, zhaoyun, 趙雲, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 7, admin, 2018-09-23 19:43:44.0, admin, 2018-09-23 19:43:52.0, 0, 81, 23, 3, null, null, null, null, 3, chenwei, 陳偉, admin, 2020-05-07 15:52:53.0, admin, 2020-05-07 15:52:59.0, 0, 7, 技術部, 5, 0, admin, 2018-09-23 19:38:00.0, null, null, 0
<== Row: 24, zhugeliang, 諸葛亮, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 7, 11, admin, 2018-09-23 19:44:23.0, admin, 2018-09-23 19:44:29.0, 0, 82, 24, 4, null, null, null, null, 4, test, 測試人員, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:11:11.0, 0, 11, 市場部, 6, 0, admin, 2018-09-23 19:39:01.0, null, null, 0
<== Row: 26, dianwei, 典韋, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 10, admin, 2018-09-23 19:45:48.0, admin, 2018-09-23 19:45:57.0, 0, 83, 26, 3, null, null, null, null, 3, chenwei, 陳偉, admin, 2020-05-07 15:52:53.0, admin, 2020-05-07 15:52:59.0, 0, 10, 市場部, 5, 0, admin, 2018-09-23 19:38:45.0, null, null, 0
<== Row: 29, sunquan, 孫權, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 10, admin, 2018-09-23 19:46:54.0, admin, 2018-09-23 19:47:03.0, 0, 85, 29, 2, null, null, null, null, 2, mng, 項目經理, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:39:28.0, 0, 10, 市場部, 5, 0, admin, 2018-09-23 19:38:45.0, null, null, 0
<== Row: 28, xunyu, 荀彧, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 10, admin, 2018-09-23 19:46:38.0, admin, 2018-11-04 15:33:17.0, 0, 86, 28, 4, null, null, null, null, 4, test, 測試人員, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:11:11.0, 0, 10, 市場部, 5, 0, admin, 2018-09-23 19:38:45.0, null, null, 0
<== Row: 27, xiahoudun, 夏侯惇, null, fd80ebd493a655608dc893a9f897d845, YzcmCZNvbXocrsz9dm8e, test@qq.com, 13889700023, 1, 8, admin, 2018-09-23 19:46:09.0, admin, 2018-09-23 19:46:17.0, 0, 87, 27, 3, null, null, null, null, 3, chenwei, 陳偉, admin, 2020-05-07 15:52:53.0, admin, 2020-05-07 15:52:59.0, 0, 8, 技術部, 4, 0, admin, 2018-09-23 19:38:10.0, null, null, 0
<== Row: 39, zhangsan5, 張三5, null, null, null, null, null, null, null, null, null, null, null, 0, 88, 39, 4, null, null, null, null, 4, test, 測試人員, admin, 2019-01-19 11:11:11.0, admin, 2019-01-19 11:11:11.0, 0, null, null, null, null, null, null, null, null, null
<== Row: 39, zhangsan5, 張三5, null, null, null, null, null, null, null, null, null, null, null, 0, 89, 39, 3, null, null, null, null, 3, chenwei, 陳偉, admin, 2020-05-07 15:52:53.0, admin, 2020-05-07 15:52:59.0, 0, null, null, null, null, null, null, null, null, null
<== Row: 34, zhangsan1, 張三1, null, null, null, null, null, null, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null
<== Row: 35, zhangsan2, 張三2, null, null, null, null, null, null, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null
<== Row: 37, zhangsan3, 張三3, null, null, null, null, null, null, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null
<== Row: 38, zhangsan4, 張三4, null, null, null, null, null, null, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null
<== Total: 20
嗯回頭看代碼是這裏出了問題。
當我們設置了Map
之後,這裏應該使用我們的Map
了,而不是使用實體對象,修改該文件。
SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.edu.njust.mango.mapper.SysUserMapper">
<resultMap type="cn.edu.njust.mango.entity.SysUser" id="SysUserMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
</resultMap>
<resultMap id="queryForListMap" type="cn.edu.njust.mango.vo.SysUserVO">
<id column="id" property="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
<association property="dept" javaType="cn.edu.njust.mango.entity.SysDept">
<id property="id" column="d_id" jdbcType="INTEGER"/>
<result property="name" column="d_name" jdbcType="VARCHAR"/>
<result property="parentId" column="d_parent_id" jdbcType="INTEGER"/>
<result property="orderNum" column="d_order_num" jdbcType="INTEGER"/>
<result property="createBy" column="d_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="d_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="d_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="d_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="d_del_flag" jdbcType="OTHER"/>
</association>
<collection property="roles" javaType="java.util.List" ofType="cn.edu.njust.mango.entity.SysRole">
<id column="role_id" property="id" jdbcType="INTEGER"/>
<result property="name" column="role_name" jdbcType="VARCHAR"/>
<result property="remark" column="role_remark" jdbcType="VARCHAR"/>
<result property="createBy" column="role_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="role_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="role_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="role_del_flag" jdbcType="OTHER"/>
</collection>
</resultMap>
<select id="getDept" resultType="cn.edu.njust.mango.entity.SysDept" parameterType="INTEGER">
SELECT
*
FROM sys_dept d
where id = #{dept_id}
</select>
<select id="queryAllByPageRequestAndConditionAndRoleAndDept" resultMap="queryForListMap">
SELECT
*
FROM
sys_user u
LEFT JOIN sys_user_role ru ON u.id = ru.user_id
LEFT JOIN sys_role r on r.id = ru.role_id
LEFT JOIN sys_dept d on d.id = u.dept_id
</select>
</mapper>
我之所以不厭其煩的貼出所有代碼,是怕部分讀者在實際操作的時候出現錯誤。這裏就暫且麻煩一點,其實只是改成這樣。
接下來再Debug
。
一陣竊喜,好像成功了,有數據了。但是真的是這樣嗎?我們展開其中的一個數據。
咱就拿zhangsan5
舉例吧!這裏好多數據是空的,但是數據庫不是這樣的啊!
39 zhangsan5 張三5 0 88 39 4 4 test 測試人員 admin 2019-01-19 11:11:11 admin 2019-01-19 11:11:11 0
39 zhangsan5 張三5 0 89 39 3 3 chenwei 陳偉 admin 2020-05-07 15:52:53 admin 2020-05-07 15:52:59 0
這裏由於數據太多,不好截圖,讀者可以運行源代碼查看,這裏我把zhangsan5
的兩條數據選中了。我們明明發現remark
是有值的,但是查詢的時候沒有出來,而且查詢結果的名稱也不對。這裏主要是不同表的名稱有重複。我們需要起別名。還是修改select
語句,修改成如下樣式。
完整代碼如下:
SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.edu.njust.mango.mapper.SysUserMapper">
<resultMap type="cn.edu.njust.mango.entity.SysUser" id="SysUserMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
</resultMap>
<resultMap id="queryForListMap" type="cn.edu.njust.mango.vo.SysUserVO">
<id column="id" property="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
<result property="avatar" column="avatar" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="salt" column="salt" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="deptId" column="dept_id" jdbcType="INTEGER"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="del_flag" jdbcType="OTHER"/>
<association property="dept" javaType="cn.edu.njust.mango.entity.SysDept">
<id property="id" column="d_id" jdbcType="INTEGER"/>
<result property="name" column="d_name" jdbcType="VARCHAR"/>
<result property="parentId" column="d_parent_id" jdbcType="INTEGER"/>
<result property="orderNum" column="d_order_num" jdbcType="INTEGER"/>
<result property="createBy" column="d_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="d_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="d_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="d_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="d_del_flag" jdbcType="OTHER"/>
</association>
<collection property="roles" javaType="java.util.List" ofType="cn.edu.njust.mango.entity.SysRole">
<id column="role_id" property="id" jdbcType="INTEGER"/>
<result property="name" column="role_name" jdbcType="VARCHAR"/>
<result property="remark" column="role_remark" jdbcType="VARCHAR"/>
<result property="createBy" column="role_create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
<result property="lastUpdateBy" column="role_last_update_by" jdbcType="VARCHAR"/>
<result property="lastUpdateTime" column="role_last_update_time" jdbcType="TIMESTAMP"/>
<result property="delFlag" column="role_del_flag" jdbcType="OTHER"/>
</collection>
</resultMap>
<select id="getDept" resultType="cn.edu.njust.mango.entity.SysDept" parameterType="INTEGER">
SELECT
*
FROM sys_dept d
where id = #{dept_id}
</select>
<select id="queryAllByPageRequestAndConditionAndRoleAndDept" resultMap="queryForListMap">
SELECT
u.*,
d.id as d_id,
d.name as d_name,
d.parent_id as d_parent_id,
d.order_num as d_order_num,
d.create_by as d_create_by,
d.create_time as d_create_time,
d.last_update_by as d_last_update_by,
d.last_update_time as d_last_update_time,
d.del_flag as d_del_flag,
r.id as 'role_id',
r.name as 'role_name',
r.remark as 'role_remark',
r.create_by as 'role_create_by',
r.create_time as 'role_create_time',
r.last_update_by as 'role_last_update_by',
r.last_update_time as 'role_last_update_time',
r.del_flag as 'role_del_flag'
FROM
sys_user u
LEFT JOIN sys_user_role ru ON u.id = ru.user_id
LEFT JOIN sys_role r on r.id = ru.role_id
LEFT JOIN sys_dept d on d.id = u.dept_id
</select>
</mapper>
再次debug
我們發現張三5的數據成功上來了,成功解決。
4、總結
書上的代碼直接運行絕大部分是對的,但是總有一些軟件的更新使得作者無能爲力。之前的API是對的,但是之後就廢棄了或修改了是常有的事。所以我們需要跟蹤源代碼。這只是一個小小的問題,如果沒有前輩的無私奉獻,很難想象我們自己一天能學到多少內容。感謝各位前輩的辛勤付出,讓我們少走了很多的彎路!
點個贊再走唄!歡迎留言哦!