上一节课我们已经完成了 OA 项目的基础部分,对 DAO 和 BEAN 的基本操作。今日开始学习 OA 项目中“组织管理”这一部分。在学习的过程中,整体上难度相对比较简单,更多的是项目经验上的学习。但在配置 hibernate 的映射文件时,大家有些应付不来。我也不例外,一对一映射关系我掌握的不好。但汤兄弟为人正直、善良,他在晚上下课后给我们被了 。
这个项目虽然未详细涉及企业项目开发中各方面细节,但整个框架是按照这个流程走的。
组织机构部分
一、设计部分
1. 了解需求:
我们没有进行详细的需求分析,汤兄弟在前天给我发了一个完成的页面层(静态页面)。需求一眼就看穿了。
1) 部门管理:增、删、改、查、(子部门)
2) 岗位管理:增、删、改、查
3) 员工管理:增、删、改、查
正如你所看到的,搞应用不就是对数据库的增、删、改、查吗? Java 将应用做的十分好,而且在继续发展。哦!这些对她来说太简单了。
2. 设计实体
设计实体的两种方式:
1) 对象 --> 表:正向工程。(推荐)
2) 表 --> 对象:反向工程。
在早之前的开发中,常见的是第二种方式先设计数据表格,然后再编程定接口。但随着 Java 的日益强大,这一过程被反过来了。面向对象的似乎还有很大的潜力!
设计实体时,我们需要考虑用到了哪些(几个)实体?实体之间的关系是什么?实体具有哪些属性?我们所说的实体就是 Bean 。汤兄弟使用 StarUML 给大家把所有的实体和实体之间的关系画了出来,我十分喜欢画图,感觉似乎比编码好多了。我在下面也跟着汤兄弟把图画出来了:
然后 UML 课程在 OA 项目之后,但看着这图多专业 ~~ !!
我们的实现流程:
设计实体 -->JavaBean--> 映射文件 --> 生成表 -->...
设计实体 -->JavaBean 都比较容易,因为我们使用了 hibernate 所以生成表也不需要我们来做了。这个流程中最为复杂的是映射文件。因为 hibernate 才讲了三天, OA 项目中算是第一次应用 hibernate 写东西。
部门实体的映射文件( department ):
< class name = "Department" table = "ccoa_department" > < id name = "id" column = "id" > < generator class = "native" /> </ id > < property name = "name" /> <!-- 与上级部门(多对一) --> < many-to-one name = "parent" column = "parentId" class = "Department" /> <!-- 与子部门(一对多) --> < set name = "children" > < key column = "parentId" /> < one-to-many class = "Department" /> </ set > <!-- 部门与员工(一对多关系映射) --> < set name = "employees" > < key column = "departmentId" /> < one-to-many class = "Employee" /> </ set > </ class > |
职员实体的映射文件( employee ):
< class name = "Employee" table = "ccoa_employee" > < id name = "id" column = "id" > < generator class = "native" /> </ id > < property name = "name" /> < property name = "sex" /> < property name = "employTime" type = "date" /> < property name = "phone" /> < property name = "email" /> < property name = "description" />
<!-- 员工对部门(多对一关系映射) --> < many-to-one name = "department" column = "departmentId" />
<!-- 员工对岗位(多对多关系映射) --> < set name = "roles" table = "ccoa_employee_roles" > < key column = "employeeId" ></ key > < many-to-many class = "Role" column = "roleId" /> </ set >
<!-- 员工对帐户(一对一关系映射) --> < one-to-one name = "user" class = "User" /> </ class > |
岗位实体的映射文件( role ):
< class name = "Role" table = "ccoa_role" > < id name = "id" column = "id" > < generator class = "native" /> </ id > < property name = "name" /> < property name = "description" /> <!-- 岗位与员工(多对多关系映射) --> < set name = "employees" table = "ccoa_employee_roles" > < key column = "roleId" /> < many-to-many class = "Employee" column = "employeeId" /> </ set > </ class > |
用户实体的映射文件( user ):
< class name = "User" table = "ccoa_user" > < id name = "id" column = "id" > < generator class = "foreign" > < param name = "property" > employee </ param > </ generator > </ id > < property name = "loginName" /> < property name = "password" /> <!-- 帐户与员工(一对一关系映射) --> < one-to-one name = "employee" class = "Employee" constrained = "true" /> </ class > |
这些映射规则设计的比较合理。但 JDO 已经比它要简单的多了。我们学习一些 hibernate 的关系映射也是十分有必要的。今天晚上汤兄弟给我复习了一下 hibernate 的映射关系,感觉没什么难的。汤兄弟说,如果大家对 hibernate 有了全局的认识。 Hibernate 很简单,就那么点东西。
二、实现部分
上边我们完成了设计部分,接下来我们来完成实现部分。汤老师是一位比较有经验的老师,他领着大家做 OA 时,是由框架到实现,一层一层的去实现我们需要的功能。而不是先设计了一个框架,然后具体去实现某一需求。一层一层的懂吗?就像剥洋葱,一层一层的,而不是切洋葱。
实现部分我们首先实现 Action ,因为由第一部分我需求我们了解到。每一个管理模块都有增、删、改、查。在我们学习 Servlet 时,我们编写一个 Servlet 对应一个操作请求,那我们得写多少个 Servlet 啊!但我们在学习 Struts1 时,接触到了一个 DispatchAction ,我们可以将某一管理模块的操作请求全部放到一个 DispatchAction 里,所以在这里我们使用了 DispatchAction 。
我们按原计划使用三层以实现,接下来开始编写 Servicen 层。哇赛,你知道多么简单吗?因为我们事先编写了 BeanDaoImpl ,所以在 Service 层中直接调用 BeanDaoImlp 实例的方法即可,此时的 Service 层显得十分没有必要,浪费得很。
继续看,我们的 BeanDaoImpl 继承自 BaseDaoImpl 。我们的 BeanDaoImpl 并未写任何方法,使用的全是父类 BaseDaoImpl 的方法。此时 BeanDaoImpl 显得也很浪费,那么我们就将它们“ @Deprecated ”掉。
我们直接将 Service 和 Dao 层合并,并且使用 BaseDaoImpl 这一个类的实例就可以了!
BaseDaoImpl 内部使用 Hibernate 的 session 实现对数据库的操作。 YEA , Hibernate 全帮我们做了。经典!
三、显示部分
显示部分我们使用的全是 JSP 页面,表单的检验我们使用的是 JavaScript ,数据显示使用的是 JSTL 和 EL 表达式。就这么简单, OK 了!
今天我们只完成了 Role (职员)管理这一部分,其他的管理模块都按照这个模块的流程来。速度非常之快!
Java 特性所能发辉的功力, Java 之父早就想到了吗?