OA中BaseDao抽象设计思路梳理
来源:互联网 发布:php 接口文档管理系统 编辑:程序博客网 时间:2024/05/16 12:14
最近在做OA时,发现BaseDao的设计怎么这么眼熟呢?原来是ITOO中的思路。可是之前只是看,没有落实到行动上去真正的分析为什么以及实现的思路,希望现在还不晚!
抽象公共接口IBaseDao
首先我们在开发一个新的系统时,里面包含的不止一个功能,而且每一个细分的功能都会涉及到增、删、改、查这些最基本的操作。如果每一个业务逻辑Dao层的接口中都要写一遍这样的接口,这样做会造成大量代码冗余,很是苦了程序员们。所以,我们决定把这些常用的公共的方法抽象出一个公共的接口,BaseDao让每一个业务Dao类去实现这个接口。如图:
但是问题来了:每一个业务Dao的实现类中除了实体不同外,实现还是相同的。我们要做的是把这些公共的实现也省去,直接可以调用BaseDao中的方法就可以满足每一个业务逻辑Dao的需求。
BaseDao抽象类产生
于是,我们新建一个继承自IBaseDao的实现类,利用泛型来进行实现公共方法的逻辑。同时,我们让各业务Dao类来继承BaseDao.这样我们在写业务Dao类时就可以直接重复利用BaseDao的实现类了,不用再重复去写多余的代码了!机构图如下:
利用泛型抽象BaseDao代码实现
@SuppressWarnings("unchecked")public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; //注入sessionfactory private Class<T> clazz; //最主要的是要解决这个代表具体类的class对象的问题 public BaseDaoImpl(){ //使用反射技术得到T的真实类型 ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass(); //获取实例化的真正的子类类型 this.clazz=(Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型 } //获取session,子类可用 protected Session getSession(){ return sessionFactory.getCurrentSession(); } //保存 public void save(T entity) { Session session=getSession(); session.save(entity); } //根据id删除实体 public void delete(Long id) { Object obj=getById(id); if(obj !=null){ getSession().delete(obj); } } //修改,更新 public void update(T entity) { getSession().update(entity); } //通过id查询实体 public T getById(Long id) { return (T)getSession().get(clazz, id); } //通过id数组查询多条记录 public List<T> getByIds(Long ids) { 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(); }}
查看整个代码的实现,我们发现,最重要的是clazz的实现,在具体的逻辑Dao中,代表User.class或者Role.class,但是由于这里用到的是泛型。java中又没有直接对T.class的支持,所以,我们想定义一个Class<T>来表示泛型的class对象。这样通过ParameterizedType 类的参数化类型来获取每一个真实的实体类。
小结
以上是BaseDao设计的思路,会发现,每一个设计都是遵循着设计模式的六大原则来设计的,最重要的还是抽象,通过不断的进行抽象,是的程序实现变得简单,归根结底还是开发人员太“懒”了。只有怕累,才会有更简便的方法!
1 0
- OA中BaseDao抽象设计思路梳理
- BaseDao的设计思路
- BaseDao设计思路
- SSH实战OA 03:设计BaseDAo
- BaseDao的设计思路---接口编程
- BaseDao设计
- java之NIO select基本设计思路梳理
- 积分商城如何梳理思路和进行设计
- 积分商城如何梳理思路和进行设计
- 通用BaseDao设计
- BaseDao接口设计
- 万能的BaseDao设计
- OA工作流程怎么梳理
- OA中时间库系统设计
- baseDao中delete方法
- 梳理一下思路
- 数据库迁移思路梳理
- Python 爬虫思路梳理
- 随机10个数和 二
- 基于形态学分水岭的分割
- shell 循环变量传递问题
- 去哪儿-首个重复字符
- Linux下tomcat启动Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of
- OA中BaseDao抽象设计思路梳理
- ARM汇编指令学习 - 实现数据块的拷贝复制
- CentOS 6.5 Web环境配置
- LeetCodet题解--17. Letter Combinations of a Phone Number(所有数字键盘组合所对应的所有字符集合)
- MySQL数据导出与导入
- 安卓简单的POST和GET请求
- 进程间互斥
- 什么是面向对象设计OOD?
- 我的C语言笔记之经典代码(一)