示例:用户、角色、菜单表的权限管理。
一、数据库要求:
1、用户表users:uid用户编号、uname用户名称
2、用户角色表usersRoles:uid用户编号、rid角色编号
3、角色表roles:rid角色编号、rname角色名称
4、角色菜单表rolesMenu:rid角色编号、mid菜单编号
5、菜单表menu:mid菜单编号、mname菜单名称
二、创建实体类:
1、用户实体类Users.java:
@Entity // 指名该类为实体类
@Table(name = "users") // 对应数据库表users
public class Users {
/**
* 用户编号
*/
@Id // 指名该列名为ID
@GenericGenerator(name = "myid", strategy = "guid")
@GeneratedValue(generator = "myid")
private String uid;
/**
* 用户名称
*/
@Column(name = "uname")
private String uname;
/**
* 用户保存N个角色的set集合
*/
@ManyToMany(targetEntity = Roles.class)
@Cascade(value = { CascadeType.SAVE_UPDATE })
@JoinTable(name = "usersroles", joinColumns = @JoinColumn(name = "uid"), inverseJoinColumns = @JoinColumn(name = "rid"))
private Set<Roles> sr = new HashSet<>();
/**
*
* 创建一个新的实例 Users.
*
*/
public Users() {
super();
}
/**
*
* 创建一个新的实例 Users.
*
* @param uid
* @param uname
* @param sr
*/
public Users(String uid, String uname, Set<Roles> sr) {
super();
this.uid = uid;
this.uname = uname;
this.sr = sr;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Set<Roles> getSr() {
return sr;
}
public void setSr(Set<Roles> sr) {
this.sr = sr;
}
}
2、角色实体类Roles.java:
@Entity // 指名该类为实体类
@Table(name = "roles") // 对应数据库表roles
public class Roles {
/**
* 角色编号
*/
@Id // 指名该列名为ID
@GenericGenerator(name = "myid", strategy = "guid")
@GeneratedValue(generator = "myid")
private String rid;
/**
* 角色名称
*/
@Column(name = "rname")
private String rname;
/**
* 用来保存N个用户,set集合唯一性,transient去除不必要的属性值
*/
@ManyToMany(targetEntity = Users.class)
@Cascade(value = { CascadeType.SAVE_UPDATE })
@JoinTable(name = "usersroles", joinColumns = @JoinColumn(name = "uid"), inverseJoinColumns = @JoinColumn(name = "rid"))
private transient Set<Users> su = new HashSet<>();
/**
* 用于保存N个菜单
*/
@ManyToMany(targetEntity = Menu.class)
@Cascade(value = { CascadeType.SAVE_UPDATE })
@JoinTable(name = "rolesmenu", joinColumns = @JoinColumn(name = "rid"), inverseJoinColumns = @JoinColumn(name = "mid"))
private Set<Menu> sm = new HashSet<>();
/**
*
* 创建一个新的实例 Roles.
*
*/
public Roles() {
super();
}
public Roles(String rid, String rname, Set<Users> su, Set<Menu> sm) {
super();
this.rid = rid;
this.rname = rname;
this.su = su;
this.sm = sm;
}
public String getRid() {
return rid;
}
public void setRid(String rid) {
this.rid = rid;
}
public String getRname() {
return rname;
}
public void setRname(String rname) {
this.rname = rname;
}
public Set<Users> getSu() {
return su;
}
public void setSu(Set<Users> su) {
this.su = su;
}
public Set<Menu> getSm() {
return sm;
}
public void setSm(Set<Menu> sm) {
this.sm = sm;
}
}
3、菜单实体类Menu.java:
@Entity // 指名该类为实体类
@Table(name = "menu") // 对应数据库表menu
public class Menu {
/**
* 菜单编号
*/
@Id // 指名ID
@GenericGenerator(name = "myid", strategy = "guid")
@GeneratedValue(generator = "myid")
private String mid;
/**
* 菜单名称
*/
@Column(name = "mname")
private String mname;
/**
* 保存N个角色,transient去除不必要的属性值
*/
@ManyToMany(targetEntity = Roles.class)
@Cascade(value = { CascadeType.SAVE_UPDATE })
@JoinTable(name = "rolesmenu", joinColumns = @JoinColumn(name = "rid"), inverseJoinColumns = @JoinColumn(name = "mid"))
private transient Set<Roles> sr = new HashSet<>();
public Menu() {
super();
}
public Menu(String mid, String mname, Set<Roles> sr) {
super();
this.mid = mid;
this.mname = mname;
this.sr = sr;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getMname() {
return mname;
}
public void setMname(String mname) {
this.mname = mname;
}
public Set<Roles> getSr() {
return sr;
}
public void setSr(Set<Roles> sr) {
this.sr = sr;
}
}
三、创建hibernate.cfg.xml配置文件(src/main/resources路径下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">sasa</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<!-- 显示sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 配置映射:引入实体类-->
<mapping class="com.zking.struts2_hibernate.entity.Users" />
<mapping class="com.zking.struts2_hibernate.entity.Roles" />
<mapping class="com.zking.struts2_hibernate.entity.Menu" />
</session-factory>
</hibernate-configuration>
四、创建实现方法的类UsersAction.java:
@Results({ @Result(name = "success", location = "/index.jsp"), @Result(name = "error", location = "/404.jsp") }) // 跳转页面
public class UsersAction {
// 创建Configuration
private Configuration configuration;
// 创建SessionFactory
private SessionFactory sessionFactory;
// 创建Session
private Session session;
// 创建事务
private Transaction transaction;
/**
*
* @Title: before
* @Description:最开始执行的方法
* @return void
*/
public void before() {
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
/**
*
* @Title: after
* @Description:最后执行的方法
* @return void
*/
public void after() {
transaction.commit();
session.close();
sessionFactory.close();
}
/**
*
* @Title: addUser
* @Description: 新增数据
* @return void
*/
@Action("addUser")
public void addUser() {
// 调用最开始执行的方法
before();
// 创建users表对象
Users u = new Users();
u.setUname("chenchao");
// 创建roles表对象
Roles r1 = new Roles();
r1.setRname("student");
Roles r2 = new Roles();
r2.setRname("staff");
// 用户表和角色表互相设值
u.getSr().add(r1);
u.getSr().add(r2);
r1.getSu().add(u);
r2.getSu().add(u);
// 创建menu表对象
Menu m1 = new Menu();
m1.setMname("attend class");
Menu m2 = new Menu();
m2.setMname("be on duty");
// 角色表和菜单表互相设值
r1.getSm().add(m1);
r2.getSm().add(m2);
m1.getSr().add(r1);
m2.getSr().add(r2);
// 保存
session.save(u);
// 调用最后执行的方法
after();
}
/**
*
* @Title: findRolesAll
* @Description: 查询数据
* @return void
*/
@Action("findRolesAll")
public void findRolesAll() throws Exception {
// 调用最开始执行的方法
before();
@SuppressWarnings("unchecked")
// 得到集合信息
List<Users> luser = session.createQuery(" from Users").list();
// 转为JSON格式
String out = JSON.toJSONString(luser);
System.out.println(out);
// 打印到页面
ServletActionContext.getResponse().getWriter().println(out);
// 刷新
ServletActionContext.getResponse().getWriter().flush();
// 关闭
ServletActionContext.getResponse().getWriter().close();
}
}
五、创建index.jsp页面,用来获取后台数据(使用ajax):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-3.2.1.js"></script>
<script type="text/javascript">
$(function(){
dataBind();
});
function dataBind(){
$.ajax({
type : "post",
dataType : "json",
data : {
t : new Date()
},
url : "findRolesAll",//访问数据地址
success : function(date) {
var table='<table align="center" width="80%"><tr><td>用户名</td><td>角色名</td><td>菜单名</td></tr>';
$.each(date,function(index,item){//循环用户表信息
console.log(item);//打印
table+="<tr><td>"+item.uname+"</td><td></td><td></td></tr>";
$.each(item.sr,function(index,item){//循环角色表信息
table+="<tr><td></td><td>"+item.rname+"</td><td></td></tr>";
$.each(item.sm,function(index,item){//循环菜单表信息
table+="<tr><td></td><td></td><td>"+item.mname+"</td></tr>";
});
});
});
table+="</table>";
$('#div1').html(table);
}
});
}
</script>
</head>
<body>
<div id="div1"></div>
</body>
</html>