项目OA之Dao层设计
来源:互联网 发布:linux父目录和子目录 编辑:程序博客网 时间:2024/05/22 06:43
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> { @Resourceprivate 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;@Repositorypublic 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 页面明天再写!
- 项目OA之Dao层设计
- 【OA】——DAO层设计
- OA项目之弹出层中再弹出层
- 【OA】Dao层“接口”、“实现”两个维度一个良好的设计学习
- 项目OA之实体类的设计
- OA项目之权限设计②
- OA项目之权限设计③
- OA系统Dao层抽取方法总结
- Spring Dao层设计
- Dao层设计
- OA项目之打印
- OA项目之导出
- OA项目之导入
- OA项目之分页
- OA项目之BaseAction
- 12.3 Dao层的设计
- ssm-dao层设计整理
- 持久层dao设计模式
- sgvbfnh
- dbhgj
- lua _G
- sql server 2008数据库无法启动的解决办法
- 字符串转换成整数
- 项目OA之Dao层设计
- 找零钱(记搜)
- 正则语言的 并 交 差
- zoj3811Untrusted Patrol((bfs+并查集)
- 关于开发的第三方框架的使用
- 无源码加解密实现 && NDK Native Hook
- 创业指南:如何快速拿到天使投资?
- 求一组数中某个指定的数
- sunnywhere的工作日志