权限树mysql,递归解决根据父节点遍历权限树菜单的问题--------mysql数据中的树表...

本人几乎没写过博客,感觉要学的知识和要做的事情太多,没时间。但发现用博客记录自己学习心得非常好,就抽时间写点,供自己以后参考也分享给某些需要的人,我水平有限,请多指教!

最近在独自尝试开发一个小型的oa系统以巩固下自己对java ssh框架的学习。这里记录下开发中的一些心得体会。

我把系统菜单设计成树,用一张表存储,各个菜单项之间是父子关系,当我们要根据用户权限去数据库中取菜单项时,发现sql语句不好解决。之前在网上查看了一些帖子博文,发现oracle中有对这个需求有专门的sql语句:类似这样

select * from pub_entity a start with a.entity_id = 88 connect by prior a.entity_id = a.super_entity_id;

但我使用的mysql没有,一些文章中说用mysql的存储过程解决,我这个刚出道的菜鸟感觉太复杂了,没去尝试。最后想到可以直接用递归算法解决:

菜单表:

20181003021700062651.jpg

实体类代码:

1 packagecom.xuwei.oa.entity;2

3 importjava.io.Serializable;4 importjava.util.Set;5

6 importjavax.persistence.Column;7 importjavax.persistence.Entity;8 importjavax.persistence.GeneratedValue;9 importjavax.persistence.GenerationType;10 importjavax.persistence.Id;11 importjavax.persistence.ManyToMany;12 importjavax.persistence.Table;13

14 importorg.apache.struts2.json.annotations.JSON;15 importorg.hibernate.annotations.GenericGenerator;16

17 /**

18 * 菜单管理实体类19 *@authorDavid20 *21 */

22 @Entity23 @Table(name="t_menu")24 public class Menu implementsSerializable{25 @Id //设置主键生成策略为手动分配

26 @GenericGenerator(name="menuGenerator",strategy="assigned")27 @GeneratedValue(generator="menuGenerator")28 private Long mid;//主键

29 @Column(name = "name", length = 15)30 private String name;//树上的节点的名称

31 @Column(name = "isParent")32 private Boolean isParent;//是否为文件夹节点

33 @Column(name = "icon", length = 100)34 private String icon;//图标图片的路径

35 @Column(name = "checked", length = 5)36 privateBoolean checked;37 @Column(name = "url", length = 60)38 private String url;//单击菜单跳转的action

39 @Column(name = "target", length = 15)40 private String target;//页面显示位置

41 @Column(name = "pid", length = 5)42 private Long pid;//父节点ID

43

44 publicLong getMid() {45 returnmid;46 }47 public voidsetMid(Long mid) {48 this.mid =mid;49 }50 publicLong getPid() {51 returnpid;52 }53 public voidsetPid(Long pid) {54 this.pid =pid;55 }56 publicString getName() {57 returnname;58 }59 public voidsetName(String name) {60 this.name =name;61 }62 publicBoolean getIsParent() {63 returnisParent;64 }65 public voidsetIsParent(Boolean isParent) {66 this.isParent =isParent;67 }68 publicString getIcon() {69 returnicon;70 }71 public voidsetIcon(String icon) {72 this.icon =icon;73 }74 publicBoolean getChecked() {75 returnchecked;76 }77 public voidsetChecked(Boolean checked) {78 this.checked =checked;79 }80 publicString getUrl() {81 returnurl;82 }83 public voidsetUrl(String url) {84 this.url =url;85 }86 publicString getTarget() {87 returntarget;88 }89 public voidsetTarget(String target) {90 this.target =target;91 }92

93 @ManyToMany(mappedBy = "menus")94 private Set users;//角色set集合

95 @JSON(serialize=false)96 public SetgetUsers() {97 returnusers;98 }99 public void setUsers(Setusers) {100 this.users =users;101 }102

103

104 }

单元测试代码:

1 privateSession session;2 private List

4

5 @Test6 public voidtestQueryAllTreeNodesByRootPid(){7 List

10 vistTreeNodesByPid(6L,res);11 for(Menu m:res){12 System.out.println("*****"+m.getName());13 }14 session.getTransaction().commit();15 }16

17 public void vistTreeNodesByPid(Long pid,List

19 String hql="from Menu m inner join fetch m.users u where m.pid=? and u.uid=? order by m.mid";20 Query query=session.createQuery(hql);21 query.setLong(0, pid);22 query.setLong(1, 16L);23 List

27 res.add(m);28 }29 for(Menu m:list){30 Long tmp_pid=m.getMid();31 if(tmp_pid!=null){32 vistTreeNodesByPid(tmp_pid,res);33 }34 }35 }

这样就轻松解决了这个问题。

原文:http://www.cnblogs.com/davidxu/p/4265994.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值