项目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


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  页面明天再写!

时间: 2024-11-10 06:41:35

项目OA之Dao层设计的相关文章

Dao层设计

一.关于Dao层 DB 对象的设计. 1.设计DB对象时,请使用包装类.因为从数据库中查出的数据项可能是null,对于int,boolean等简单数据类型,没有办法表示null,会使程序抛出异常. 2.对于mysql要设计是否类型的字段请使用TINYINT类型,对应的java类型为Boolean. 3.对于mysql 字段类型 到Java类型的映射,请参考如下如所示. MySQL数据类型 JAVA数据类型 JDBC TYPE 普通变量类型 主键类型 BIGINT Long BIGINT 支持 支

[原创]java WEB学习笔记21:案例完整实践(part 2)---.DAO层设计

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

maven项目创建4 dao层整合

项目配置文件要放在打包成war包的web项目中,注配置文件在去copy逆向工程 创建文件步骤 1    SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-

Java高并发秒杀API之业务分析与DAO层

课程介绍 高并发和秒杀都是当今的热门词汇,如何使用Java框架实现高并发秒杀API是该系列课程要研究的内容.秒杀系列课程分为四门,本门课程是第一门,主要对秒杀业务进行分析设计,以及DAO层的实现.课程中使用了流行的框架组合SpringMVC+Spring+MyBatis,还等什么,赶快来加入吧! 第1章 课程介绍 本章介绍秒杀系统的技术内容,以及系统演示.并介绍不同程度的学员可以学到什么内容. 第2章 梳理所有技术和搭建工程 本章首先介绍秒杀系统所用框架和技术点,然后介绍如何基于maven搭建项

Java通过JDBC 进行Dao层的封装

前言 前面有一章节,我专门讲解了Java通过JDBC 进行MySQL数据库操作,这主要讲解了MySQL数据库的连接和简单的操作,但是在真正的Java项目中,我们要不断的和数据库打交道,为了提高数据库操作的执行效率和增加代码的复用性,将重新封装一个Dao层,也就是数据访问层 ,用来访问数据库实现数据的持久化. Dao层设计 Dao层操作通用的步骤: 1.写SQL语句 2.获取连接 3.创建stmt 4.执行sql a)更新 String sql = "delete from admin where

项目OA之实体类的设计

1.明天中秋啦,苦逼啊,自己一个人过啊,不过幸好有OA项目陪着也不孤单,继续做我的笔记,接着昨天的. 2.昨天笔记已经搭建好了SSH环境和SSH的整合,今天需要做的就是实体类的设计和分析,首先我们将资源结构分好建立一个config文件夹用来放置所有的配置文件,前文已经说过,注意需要放置在类路径下也就是直接在项目名右击建立sourcefolder,建立对应的jsp 存放页面,style存放样式,script存放脚本语言等等 3.根据项目的需求设计实体类,我这里是使用的starUml工具画的UML图

SSH 项目中 用Hibernate底层 简单的封装DAO层

废话不多少了,主要是使用hibernate的查询方法,自己封装了DAO层,供service来方便使用. 首先:必须要继承的 public class CommonDao extends HibernateDaoSupport 紧接着是要注入必须的数据源: @Resource private SessionFactory sessionFactory; @PostConstruct public void initSessionFactory() { super.setSessionFactory

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl

在spring+hibernate的web项目中,处理数据层通常会使用Spring框架提供的HibernateTemplate类提供的方法.通常的用法是每一个实体类对应的去写DAO层的接口和实现类.每个实现类中都写hibernateTemp.save(entity).hibernateTemp.update(entity).hibernateTemp.get(id)...这样写固然没错,但存在着大量的重复代码.所以懒惰的程序员烦了,他们要写一个通用的实现类来解决这个问题,让DAO层解放出来.如果

一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构

表现层就是看到的东西,比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了,存东西用的DAO层就是将访问数据库的代码,数据库层是数据存储与管理的代码 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO. VO,值对象