OA学习笔记-007-Dao层设计

一、

User, UserDao
save(User user), update(), delete(), find(), ...
Role, RoleDao
save(Role role), update(), delete(), find(), ...
Student, StudentDao
save(Student student), update(), delete(), find(), ...
...

BaseDao<T>
save(T t), update(), delete(), find()

UserDao extends BaseDao<User> { ... }
RoleDao extends BaseDao<Role>{ ... }
...

二、接口层抽取公共代码

BaseDao.java

 1 public interface BaseDao<T> {
 2
 3     /**
 4      * 保存实体
 5      *
 6      * @param entity
 7      */
 8     void save(T entity);
 9
10     /**
11      * 删除实体
12      *
13      * @param id
14      */
15     void delete(Long id);
16
17     /**
18      * 更新实体
19      *
20      * @param entity
21      */
22     void update(T entity);
23
24     /**
25      * 按id查询
26      *
27      * @param id
28      * @return
29      */
30     T getById(Long id);
31
32     /**
33      * 按id查询
34      *
35      * @param ids
36      * @return
37      */
38     List<T> getByIds(Long[] ids);
39
40     /**
41      * 查询所有
42      *
43      * @return
44      */
45     List<T> findAll();
46
47 }

三、实现层抽取公共代码

BaseDaoImpl.java

 1 import java.lang.reflect.ParameterizedType;
 2 import java.util.List;
 3
 4 import javax.annotation.Resource;
 5
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8
 9 @SuppressWarnings("unchecked")
10 public abstract class BaseDaoImpl<T> implements BaseDao<T> {
11
12     //这里不用管事务,因为由spring做
13     @Resource
14     private SessionFactory sessionFactory;
15     private Class<T> clazz;
16
17     public BaseDaoImpl() {
18         // 使用反射技术得到T的真实类型
19         // this表示当前new 的对象
20         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型
21         this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型,如 new Map<K,V>,此方法返回[k,v]
22         System.out.println("clazz ---> " + clazz);
23     }
24
25     /**
26      * 获取当前可用的Session
27      * 给子类方便获取session
28      * @return
29      */
30     protected Session getSession() {
31         return sessionFactory.getCurrentSession();
32     }
33
34     public void save(T entity) {
35         getSession().save(entity);
36     }
37
38     public void update(T entity) {
39         getSession().update(entity);
40     }
41
42     public void delete(Long id) {
43         Object obj = getById(id);
44         if (obj != null) {
45             getSession().delete(obj);
46         }
47     }
48
49     public T getById(Long id) {
50         return (T) getSession().get(clazz, id);
51     }
52
53     public List<T> getByIds(Long[] ids) {
54         return getSession().createQuery(//防止被格式化
55                 "FROM User WHERE id IN (:ids)")//
56                 .setParameterList("ids", ids)//
57                 .list();
58     }
59
60     public List<T> findAll() {
61         return getSession().createQuery(//
62                 "FROM " + clazz.getSimpleName())//
63                 .list();
64     }
65
66 }

四、测试

1 public class BaseDaoTest {
2
3     @Test
4     public void testSave() {
5         UserDao userDao = new UserDaoImpl();
6         RoleDao roleDao = new RoleDaoImpl();
7     }
8
9 }
时间: 2024-10-07 23:23:06

OA学习笔记-007-Dao层设计的相关文章

项目OA之Dao层设计

1.今天中秋节,一个人过,祝自己能找到一个好的实习,不多废话,写上今天的项目笔记. 2.昨天完成了OA系统管理中的User       Department     Role  3个实体类的设计,今天完成其中一组的功能设计,细节很多,知识点很多,整理的比较长. 3.首先需要处理的就是包结构的设计,分三层:显示层(View),业务层(Service),数据访问层(Dao)如下: 包名 说明 com.icss.oa.domain 实体(Domain) com.icss.oa.dao Dao接口 co

ObjectARX 学习笔记007:创建模态对话框的一般步骤

1.新建一个工程,注意将"使用MFC"选项勾上. 2.使用[insert/Resouce]菜单项插入一个对话框. 3.此时会弹出一个窗体,直接按Enter键可以调出[属性]面板.设置窗体的ID和窗体的Caption. 4.可以点击[属性]面板左上角的图钉图标将其常显. 5.向窗体中插入控件,依次设置其ID与Caption. 6.按Ctrl+W为对话框资源创建一个类.此时系统会在工程中添加一个.cpp文件和一个对应的.h文件. 7.注册一个新命令,用于显示新的对话框. 8.在xxxCom

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

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

OA学习笔记-008-岗位管理Action层实现

一.分析 1,设计实体/表 设计实体 --> JavaBean --> hbm.xml --> 建表 2,分析有几个功能,对应几个请求. 3,实现功能: 1,写Action类,写Action中的方法,确定Service中的方法. 2,写Service方法,确定Dao中的方法. 3,写Dao方法. 4,写JSP ============================ 请求数量 地址栏转发 1 不变重定向 2 变化 增删改查共4个功能,需要6个请求.所以需要相应的6个Action方法,每个

Dao层设计

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

网上图书商城项目学习笔记-007登录功能实现

一.功能流程分析 二.代码 1.view层 1)login.jsp 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 4 5 <!DOCTYPE HT

TCP/IP详解学习笔记(三) 链路层

学习知识很简单,但坚持不懈却又是如此的困难,即使一直对自己说"努力,不能停下"的我也慢慢懈怠了... 闲话不多说,本篇将讲述TCP/IP协议栈的链路层.在本系列第一篇我讲到,TCP/IP协议栈每一层都有特定的功能, 那么链路层的功能如下: (1). 为IP模块发送和接收数据包 (2). 为ARP模块发送ARP请求和接收ARP应答 (3). 为RARP发送RARP请求和接收RARP应答 1.ARP, RARP协议概述 ARP协议即地址解析协议, 通过该协议应用层可以通过IP地址查询到目的

学习笔记TF014:卷积层、激活函数、池化层、归一化层、高级层

CNN神经网络架构至少包含一个卷积层 (tf.nn.conv2d).单层CNN检测边缘.图像识别分类,使用不同层类型支持卷积层,减少过拟合,加速训练过程,降低内存占用率. TensorFlow加速所有不同类弄卷积层卷积运算.tf.nn.depthwise_conv2d,一个卷积层输出边接到另一个卷积层输入,创建遵循Inception架构网络 Rethinking the Inception Architecture for Computer Vision https://arxiv.org/ab

OA学习笔记-006-SPRING2.5与hibernate3.5整合

一.为什么要整合 1,管理SessionFactory实例(只需要一个) 2,声明式事务管理 spirng的作用 IOC 管理对象.. AOP 事务管理.. 二.整合步骤 1.整合sessionFactory 在applicationContext.xml添加 1 <!-- 导入外部的properties文件 --> 2 <context:property-placeholder location="classpath:jdbc.properties"/> 3