1.今天中秋节,一个人过,祝自己能找到一个好的实习,不多废话,写上今天的项目笔记.
2.昨天完成了OA系统管理中的User Department Role 3个实体类的设计,今天完成其中一组的功能设计,细节很多,知识点很多,整理的比较长.
3.首先需要处理的就是包结构的设计,分三层:显示层(View),业务层(Service),数据访问层(Dao)如下:
包名 | 说明 |
com.icss.oa.domain | 实体(Domain) |
com.icss.oa.dao | Dao接口 |
com.icss.oa.dao.impl | Dao的实现类 |
com.icss.oa.service | Service接口 |
com.icss.oa.service.impl | Service的实现类 |
com.icss.oa.view.action | Struts的Action |
com.icss.oa.util | 一些工具类 |
com.icss.oa.cfg |
|
com.icss.oa.filter |
View 显示 Jsp + JSTL+ Struts + jQuery
Service 业务逻辑 JBPM
Dao 数据访问 Hibernate
4.下面就是设计BaseDao和BaseDaoImpl(如图:此设计非常合理)
每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。
实体 Dao接口 实现类
User --> UserDao --> UserDaoImpl
Role --> RoleDao --> RoleDaoImpl
Department --> DepartmentDao --> DepartmentDaoImpl
Article --> ArticleDao --> ArticleDaoImpl
...
5.对着上面的Dao设计图,写出具体的类并实现其中的方法代码如下:
BaseDao
package com.icss.oa.base;
import java.util.List;
public interface BaseDao<T> {
public void save(T entity);
public void delete(Long id);
public void update(T entity);
public T getById(Long id);
public List<T> getByIds(Long[] ids);
public List<T> findAll();
}
BaseDaoImpl(基础方法的实现,太多需要注意的地方,如:注解注入,如何获取带泛型参数的那个类,HQL语句的编写,占位符,编写HQL语句一定注意关键字左右的空格不然会报错,session的获取等等一定要亲手一个一个敲出来)
package com.icss.oa.base;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
@SuppressWarnings("unchecked")
public class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
private Class<T> clazz;
public BaseDaoImpl(){
ParameterizedType pt= (ParameterizedType) this.getClass().getGenericSuperclass();
this.clazz= (Class) pt.getActualTypeArguments()[0];
System.out.println("clazz="+clazz.getName());
}
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public void save(T entity) {
getSession().save(entity);
}
public void delete(Long id) {
Object object = getSession().get(clazz, id);
getSession().delete(object);
}
public void update(T entity) {
getSession().update(clazz);
}
public T getById(Long id) {
return (T) getSession().get(clazz, id);
}
public List<T> getByIds(Long[] ids) {
if( ids == null || ids.length == 0 ){
return Collections.EMPTY_LIST;
}
return getSession().createQuery(
" FROM "+clazz.getSimpleName()+" WHERE id IN (:ids)")
.setParameter("ids", ids)
.list();
}
public List<T> findAll() {
return getSession().createQuery(" FROM "+clazz.getSimpleName()).list();
}
}
RoleDao
package com.icss.oa.dao;
import java.util.List;
import com.icss.oa.base.BaseDao;
import com.icss.oa.domain.Role;
public interface RoleDao extends BaseDao<Role> {
}
RoleDaoImpl Dao层注解一定写上
package com.icss.oa.dao.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.icss.oa.base.BaseDaoImpl;
import com.icss.oa.dao.RoleDao;
import com.icss.oa.domain.Role;
@Repository
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao {
}
1, 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?
答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。
2, UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?
答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。
使用反射获取类型参数的真实类型的代码如下:
public DaoBaseImpl () { Type type = this.getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) type; this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; } |
说明:
1, 使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。
2, 暂时不实现getSession()方法,在后面的事务管理中实现:
protected Session getSession(){
throw new UnsupportedOperationException();
}
5.Dao层设计完成后 开始处理功能需要先看下静态页面,看看都有些什么样的功能,如图:(首先处理岗位管理功能,无非是增删改查)
具体的设计思路如下(分析增删改查功能):
增删改查共4个功能,6个请求,需要在Action中有6个对应的处理方法(这里需要非常注意一个点就是删除和修改到最后都是返回到显示列表页面所以我们必须知道“转发”和“重定向”的区别)
请求数 地址栏
转发 1 不变
重定向 2 变
---------------------------------------------
列表 list() list list.jsp
删除 delete() toList
添加页面 addUI() addUI addUI.jsp
添加 add() toList
修改页面 editUI() editUI editUI.jsp
修改 edit() toList
6.具体的代码和action jsp 页面明天再写!