思维导图:

页面左侧可收缩菜单案例

页面效果:

页面左侧可收缩菜单案例

思维导图的事项,有些可以并行有些要串行,视情况而定,做完一部分测试一部分,慢慢来。

1.创建数据库:

 create database menudemo; 

2.创建表:

1 CREATE TABLE menu (
2   id int(11) NOT NULL auto_increment,
3   linkURL varchar(255) default NULL,
4   menuName varchar(255) default NULL,
5   parent_id int(11) default NULL,
6   PRIMARY KEY  (id),
7   KEY FK33155F9A1787B5 (parent_id),
8   CONSTRAINT FK33155F9A1787B5 FOREIGN KEY (parent_id) REFERENCES menu (id)
9 )

好吧,其实这是hibernate自动生成的。id,linkURL,menuName,parent_id这些基本字段,再加上 parent_id 和 id的外键映射。

测试数据后面自动生成。

3.导入hibernate框架,本次用的是hiberante 3.3.2版本,具体过程:

  1)先加入hibernate3.jar、required 下面的jar包

  2) 再加入 annotation 下的包:hibernate-annotations.jar、ejb3-persistence.jar、hibernate-commons-annotations.jar

  3)为了看输出的SQL语句:加入log4j、slf4j-log4j12-1.5.8.jar、log4j.properties

  4)数据库驱动

  5)新建 hibernate.cfg.xml,从api中考进来,改改配置(connection,方言,show_sql,ddlhbm)

  6) 新建一个 pojo ,测试一下是否能生成表了,成功就可以了。

4.编写Menu 类、配置树状映射:

Menu:one-to-many FetchType 设为 EAGER,不然json数据生成由于懒加载会出问题

 1 package com.shawn.bean;
 2 
 3 import java.io.Serializable;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 import javax.persistence.CascadeType;
 8 import javax.persistence.Entity;
 9 import javax.persistence.FetchType;
10 import javax.persistence.GeneratedValue;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.ManyToOne;
14 import javax.persistence.OneToMany;
15 import javax.persistence.Table;
16 
17 @Entity
18 @Table(name="menu")
19 public class Menu implements Serializable{
20     
21     private static final long serialVersionUID = -7798302038641404427L;
22 
23     private Integer id;
24     
25     //菜单名
26     private String menuName;
27     
28     //链接URL
29     private String linkURL;
30     
31     //子节点(Menu集合)
32     private List<Menu> children = new ArrayList<Menu>();
33     
34     //父节点(Menu)
35     private transient Menu parent;
36 
37     @Id
38     @GeneratedValue
39     public Integer getId() {
40         return id;
41     }
42 
43     public void setId(Integer id) {
44         this.id = id;
45     }
46 
47     public String getMenuName() {
48         return menuName;
49     }
50 
51     public void setMenuName(String menuName) {
52         this.menuName = menuName;
53     }
54 
55     @OneToMany(cascade=CascadeType.ALL,mappedBy="parent",fetch=FetchType.EAGER)
56     public List<Menu> getChildren() {
57         return children;
58     }
59 
60     public void setChildren(List<Menu> children) {
61         this.children = children;
62     }
63 
64     @ManyToOne(fetch=FetchType.EAGER)
65     @JoinColumn(name="parent_id")
66     public Menu getParent() {
67         return parent;
68     }
69 
70     public void setParent(Menu parent) {
71         this.parent = parent;
72     }
73 
74     public String getLinkURL() {
75         return linkURL;
76     }
77 
78     public void setLinkURL(String linkURL) {
79         this.linkURL = linkURL;
80     }
81     
82 }

5.造测试数据,测试bean

测试类:

  1 package com.shawn.bean;
  2 
  3 import java.util.ArrayList;
  4 
  5 import org.hibernate.Query;
  6 import org.hibernate.Session;
  7 import org.hibernate.SessionFactory;
  8 import org.hibernate.cfg.AnnotationConfiguration;
  9 import org.hibernate.tool.hbm2ddl.SchemaExport;
 10 import org.junit.After;
 11 import org.junit.Before;
 12 import org.junit.Test;
 13 
 14 public class MenuTest {
 15     private static SessionFactory sf = null;
 16     
 17     @Before
 18     public void before(){
 19         sf = new AnnotationConfiguration().configure().buildSessionFactory();
 20     }
 21     
 22     @After
 23     public void after(){
 24         if(sf != null){
 25             sf.close();
 26         }
 27     }
 28     
 29     @Test
 30     public void testSchemaExport(){
 31         new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
 32     }
 33     
 34     @Test
 35     public void testMenuSave(){
 36         
 37         /*=========================日常管理=========================*/
 38         
 39         Menu richang = new Menu();//日常管理
 40         richang.setParent(null);
 41         richang.setMenuName("日常管理");
 42         richang.setLinkURL(null);
 43         
 44         Menu huiyi = new Menu();//会议管理
 45         huiyi.setParent(richang);
 46         huiyi.setMenuName("会议管理");
 47         huiyi.setLinkURL("pages/richang/metting_index.jsp");
 48         
 49         Menu gonggao = new Menu();//公告管理
 50         gonggao.setParent(richang);
 51         gonggao.setMenuName("公告管理");
 52         gonggao.setLinkURL("pages/richang/bbc_index.jsp");
 53         
 54         richang.getChildren().add(huiyi);
 55         richang.getChildren().add(gonggao);
 56         
 57         /*=========================考勤管理=========================*/
 58         
 59         Menu kaoqing = new Menu();//考勤管理
 60         kaoqing.setParent(null);
 61         kaoqing.setMenuName("考勤管理");
 62         kaoqing.setLinkURL(null);
 63         
 64         Menu waichu = new Menu();
 65         waichu.setParent(kaoqing);
 66         waichu.setMenuName("外出登记");
 67         waichu.setLinkURL("pages/kaoqing/waichu.jsp");
 68         
 69         Menu qingjia = new Menu();
 70         qingjia.setParent(kaoqing);
 71         qingjia.setMenuName("请假登记");
 72         qingjia.setLinkURL("pages/kaoqing/qingjia.jsp");
 73         
 74         Menu chuchai = new Menu();
 75         chuchai.setParent(kaoqing);
 76         chuchai.setMenuName("出差登记");
 77         chuchai.setLinkURL("pages/kaoqing/chuchai.jsp");
 78         
 79         Menu shangxiaban = new Menu();
 80         shangxiaban.setParent(kaoqing);
 81         shangxiaban.setMenuName("上下班登记");
 82         shangxiaban.setLinkURL("pages/kaoqing/shangxiaban.jsp");
 83         
 84         Menu shangban = new Menu();//上班登记
 85         shangban.setParent(shangxiaban);
 86         shangban.setMenuName("上班登记");
 87         shangban.setLinkURL("pages/kaoqing/shangban.jsp");
 88         
 89         Menu xiaban = new Menu();//下班登记
 90         xiaban.setParent(shangxiaban);
 91         xiaban.setMenuName("下班登记");
 92         xiaban.setLinkURL("pages/kaoqing/xiaban.jsp");
 93         
 94         shangxiaban.getChildren().add(shangban);
 95         shangxiaban.getChildren().add(xiaban);
 96         
 97         kaoqing.getChildren().add(waichu);
 98         kaoqing.getChildren().add(qingjia);
 99         kaoqing.getChildren().add(chuchai);
100         kaoqing.getChildren().add(shangxiaban);
101         /*=========================计划制定=========================*/
102         
103         Menu jihua = new Menu();//计划制定
104         jihua.setParent(null);
105         jihua.setMenuName("计划制定");
106         jihua.setLinkURL(null);
107         
108         Menu qiyePlan = new Menu();
109         qiyePlan.setParent(jihua);
110         qiyePlan.setMenuName("企业计划");
111         qiyePlan.setLinkURL("pages/jihua/qiyePlan.jsp");
112         
113         Menu bumenPlan = new Menu();
114         bumenPlan.setParent(jihua);
115         bumenPlan.setMenuName("部门计划");
116         bumenPlan.setLinkURL("pages/jihua/bumenPlan.jsp");
117         
118         Menu gerenPlan = new Menu();
119         gerenPlan.setParent(jihua);
120         gerenPlan.setMenuName("个人计划");
121         gerenPlan.setLinkURL("pages/jihua/gerenPlan.jsp");
122         
123         jihua.getChildren().add(qiyePlan);
124         jihua.getChildren().add(bumenPlan);
125         jihua.getChildren().add(gerenPlan);
126         /*=========================审核管理=========================*/
127         
128         Menu shenhe = new Menu();//审核管理
129         shenhe.setParent(null);
130         shenhe.setMenuName("审核管理");
131         shenhe.setLinkURL(null);
132         
133         Menu fbApply = new Menu();
134         fbApply.setParent(shenhe);
135         fbApply.setMenuName("发布申请");
136         fbApply.setLinkURL("pages/shenhe/fbApply.jsp");
137         
138         Menu shenheApply = new Menu();
139         shenheApply.setParent(shenhe);
140         shenheApply.setMenuName("审核批示");
141         shenheApply.setLinkURL("pages/shenhe/shenheApply.jsp");
142         
143         shenhe.getChildren().add(fbApply);
144         shenhe.getChildren().add(shenheApply);
145         
146         /*=========================员工管理=========================*/
147         
148         Menu memManage = new Menu();//员工管理
149         memManage.setParent(null);
150         memManage.setMenuName("员工管理");
151         memManage.setLinkURL(null);
152         
153         Menu memAdd = new Menu();
154         memAdd.setParent(memManage);
155         memAdd.setMenuName("员工添加");
156         memAdd.setLinkURL("pages/yuangong/memAdd.jsp");
157         
158         Menu memUpdate = new Menu();
159         memUpdate.setParent(memManage);
160         memUpdate.setMenuName("员工维护");
161         memUpdate.setLinkURL("pages/yuangong/memUpdate.jsp");
162         
163         memManage.getChildren().add(memAdd);
164         memManage.getChildren().add(memUpdate);
165         
166         /*=========================通讯管理=========================*/
167         
168         Menu tongxun = new Menu();//通讯管理
169         tongxun.setParent(null);
170         tongxun.setMenuName("通讯管理");
171         tongxun.setLinkURL(null);
172         
173         Menu tongxun_xianshi = new Menu();
174         tongxun_xianshi.setParent(tongxun);
175         tongxun_xianshi.setMenuName("显示通讯组");
176         tongxun_xianshi.setLinkURL("pages/tongxun/tongxun_xianshi.jsp");
177         
178         Menu tongxun_tianjia = new Menu();
179         tongxun_tianjia.setParent(tongxun);
180         tongxun_tianjia.setMenuName("增加通讯详细信息");
181         tongxun_tianjia.setLinkURL("pages/tongxun/tongxun_add.jsp");
182         
183         tongxun.getChildren().add(tongxun_xianshi);
184         tongxun.getChildren().add(tongxun_tianjia);
185         
186         Session session = sf.getCurrentSession();
187         session.beginTransaction();
188         
189         session.save(richang);
190         session.save(kaoqing);
191         session.save(jihua);
192         session.save(shenhe);
193         session.save(memManage);
194         session.save(tongxun);
195         
196         session.getTransaction().commit();
197     }
198     
199     @Test
200     public void testLoad(){
201         
202         Session session = sf.getCurrentSession();
203         session.beginTransaction();
204         Query query = session.createQuery("from Menu t where t.parent.id is null");
205         //递归输出所有节点
206         ArrayList<Menu> list = (ArrayList<Menu>)query.list();
207         for(Menu menu : list){
208             System.out.println(menu.getMenuName());
209             print(menu,0);
210         }
211         session.getTransaction().commit();
212     }
213     
214     //输出方法
215     private void print(Menu menu,int level) {
216         String preStr = "";
217         for(int i=0;i<level;i++){
218             preStr += "----|";
219         }
220         
221         System.out.println(preStr + menu.getMenuName());
222         for(Menu m:menu.getChildren()){
223             //如果有子节点,则继续往下递归
224             print(m,level+1);
225         }
226     }
227 }
View Code

相关文章: