概述:通过反射技术执行相应的方法
数据库
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 8.0.18 : Database - demo
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`demo` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `demo`;
/*Table structure for table `account` */
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`aname` varchar(20) DEFAULT NULL,
`password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '123',
`sex` enum('男','女') DEFAULT NULL,
`cardnum` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`rid` int(11) DEFAULT NULL,
PRIMARY KEY (`aid`),
UNIQUE KEY `aname` (`aname`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;
/*Data for the table `account` */
insert into `account`(`aid`,`aname`,`password`,`sex`,`cardnum`,`rid`) values (1,'admin','123','男',NULL,2),(2,'lily','123',NULL,'1111',1),(3,'rose','123','男','2222',1),(4,'lucy','123',NULL,NULL,1),(5,'tom','123',NULL,'3333',1),(6,'jack','123',NULL,NULL,1);
/*Table structure for table `menu` */
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`mid` int(11) NOT NULL AUTO_INCREMENT,
`mname` varchar(20) DEFAULT NULL,
`murl` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`fmid` int(11) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
KEY `mid` (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
/*Data for the table `menu` */
insert into `menu`(`mid`,`mname`,`murl`,`fmid`,`level`,`status`) values (1,'登录','/account.do?method=query',6,1,2),(2,'用户添加','cn.kgc.tangcco.service.AccountService',7,1,2),(3,'用户列表','cn.kgc.tangcco.service.AccountService',8,1,2),(4,'角色添加','cn.kgc.tangcco.service.RoleService',0,1,2),(5,'角色列表','cn.kgc.tangcco.service.RoleService',0,1,2),(6,'菜单列表','cn.kgc.tangcco.service.MenuService',0,1,2),(7,'注册','/kkk.do',0,1,2),(8,'查询角色所关联的菜单',NULL,0,11,2);
/*Table structure for table `menu_fanshe` */
DROP TABLE IF EXISTS `menu_fanshe`;
CREATE TABLE `menu_fanshe` (
`mid` int(11) NOT NULL DEFAULT '0',
`mname` varchar(20) DEFAULT NULL,
`murl` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`fmid` int(11) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`method` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `menu_fanshe` */
insert into `menu_fanshe`(`mid`,`mname`,`murl`,`fmid`,`level`,`status`,`method`) values (1,'登录','/account.do?method=query',6,1,2,NULL),(2,'用户添加','cn.kgc.tangcco.service.AccountService',7,1,2,'addaccount'),(3,'用户删除','cn.kgc.tangcco.service.AccountService',8,1,2,'delaccount'),(4,'角色添加','cn.kgc.tangcco.service.RoleService',0,1,2,'addrole'),(5,'角色删除','cn.kgc.tangcco.service.RoleService',0,1,2,'delrole'),(6,'菜单添加','cn.kgc.tangcco.service.MenuService',0,1,2,'addmenu'),(7,'菜单删除','/kkk.do',0,1,2,'delmenu'),(8,'查询角色所关联的菜单',NULL,0,11,2,NULL);
/*Table structure for table `role` */
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`rid` int(11) NOT NULL AUTO_INCREMENT,
`rname` varchar(20) DEFAULT NULL,
`remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`rid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
/*Data for the table `role` */
insert into `role`(`rid`,`rname`,`remark`) values (1,'普通员工',NULL),(2,'超级管理员',NULL);
/*Table structure for table `role_menu` */
DROP TABLE IF EXISTS `role_menu`;
CREATE TABLE `role_menu` (
`rmid` int(11) NOT NULL AUTO_INCREMENT,
`rid` int(11) DEFAULT NULL,
`mid` int(11) DEFAULT NULL,
PRIMARY KEY (`rmid`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
/*Data for the table `role_menu` */
insert into `role_menu`(`rmid`,`rid`,`mid`) values (1,1,1),(2,1,3),(3,1,5),(4,1,7),(5,2,2),(6,2,3),(7,2,4),(8,2,5),(9,2,6),(10,2,8);
Account2
package cn.kgc.tangcco.manager;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account2 {
private int aid;
private String aname;
private String password;
private String sex;
private String cardnum;
private int rid;
private String rname;
private String remark;
}
Menu
package cn.kgc.tangcco.manager;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu {
private int mid;
private String mname;
private String murl;
private String method;
}
AccountService
package cn.kgc.tangcco.service;
/**
* 用户的业务类
*
* @author dell
*
*/
public class AccountService {
public void addaccount() {
System.out.println("AccountService类中用户添加功能");
}
public void selaccount() {
System.out.println("AccountService类中用户查询功能");
}
public void delaccount() {
System.out.println("AccountService类中用户删除功能");
}
public void upaccount() {
System.out.println("AccountService类中用户修改功能");
}
}
MenuService
package cn.kgc.tangcco.service;
/**
* 菜单的业务类
*
* @author dell
*
*/
public class MenuService {
public void addmenu() {
System.out.println("MenuService类中菜单添加功能");
}
public void selmenu() {
System.out.println("MenuService类中菜单查询功能");
}
public void delmenu() {
System.out.println("MenuService类中菜单删除功能");
}
public void upmenu() {
System.out.println("MenuService类中菜单修改功能");
}
}
RoleService
package cn.kgc.tangcco.service;
/**
* 角色的业务类
*
* @author dell
*
*/
public class RoleService {
public void addrole() {
System.out.println("RoleService类中角色添加功能");
}
public void selrole() {
System.out.println("RoleService类中角色查询功能");
}
public void delrole() {
System.out.println("RoleService类中角色删除功能");
}
public void uprole() {
System.out.println("RoleService类中角色修改功能");
}
}
TestDemo
package cn.kgc.tangcco.manager;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Scanner;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 查询用户不同,角色不同,显示出不同的菜单 通过数据库的分析---- admin---管理员----(用户,角色,菜单)(查询,添加,删除)
* lily----普通员工----(用户,角色,菜单) (查询)
*
* @author dell
*
*/
public class TestDemo {
// 1.建立连接改为用数据库连接池,通过c3p0-config.xml
static ComboPooledDataSource datasource = new ComboPooledDataSource();
// 2.从连接池中获取一个连接,对sql语句进行处理的操作改为用dbutils技术,加载jar包
static QueryRunner qr = new QueryRunner(datasource);
public static void main(String[] args) {
// 3.如果执行
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
// 查询用户是否存在,存在的话是什么角色,再根据角色显示菜单|不存在就要给出提示
String sql = "SELECT account.*,role.rname,role.remark FROM account LEFT JOIN role ON account.rid=role.rid where aname=? and password=? ";
Account2 account2 = qr.query(sql, new BeanHandler<Account2>(Account2.class), username, password);
if (account2 != null) {
// 存在
System.out.println("当前登录用户是:" + account2.getAname() + ",所属角色:" + account2.getRname());
menu(account2);
} else {
// 不存在
System.out.println("输入的用户和密码有误");
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据用户及他的角色显示菜单(菜单表没有角色,所有要和role_menu表关联)
public static void menu(Account2 account2) throws Exception {
// 根据用户对应的角色去关联菜单,
// sql书写时只需要菜单menu和关联表role_menu关联就有菜单信息和角色id
String sql = "select * from menu_fanshe m left join role_menu rm on m.mid=rm.mid" + " where rm.rid=?";
List<Menu> menulist = qr.query(sql, new BeanListHandler<Menu>(Menu.class), account2.getRid());
// 显示的是当前用户登录进来后看到的菜单
for (int i = 0; i < menulist.size(); i++) {
System.out.println((i + 1) + ":" + menulist.get(i)); // 显示菜单的所有信息
// System.out.println((i+1)+":"+menulist.get(i).getMname());//只会显示菜单名称
}
// -----------------------------------------------------
System.out.println("请输入功能号:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Menu m = menulist.get(n - 1);
System.out.println("你选择的菜单是:" + m);
//通过路径获取class对象
Class clazz = Class.forName(m.getMurl());
//相当于new RoleService()| new MeuService()|new AccountService()
Object obj = clazz.newInstance();
//通过方法名获取Method对象
Method method = clazz.getDeclaredMethod(m.getMethod());
//抑制Java的访问控制检查,默认为false
method.setAccessible(true);
//执行obj的method方法
method.invoke(obj);
}
}