思维导图:
页面效果:
思维导图的事项,有些可以并行有些要串行,视情况而定,做完一部分测试一部分,慢慢来。
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 }