项目OA之Dao层设计

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

StrutsAction

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, 有了DaoBaseDaoImplBase,还要用UserDaoRoleDao

答:要用。因为UserDaoRoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承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  页面明天再写!大哭













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值