dao层通用封装

泛型可以是使用编译时验证(类型安全性)的功能来创建可重用代码的强大工具。

不幸的是,我感到主流开发人员仍然对此感到恐惧。

但是,比喻海格的蜘蛛,我会说,泛型是被严重误解的生物……:-)

我希望以下示例可以证明它们的实用性。

问题 – DAO(数据访问对象)类具有通用的方法,例如保存,更新,删除,loadAll ..,这在每个DAO类中都是必需的。

用这些通用方法编写基类并使每个DAO对象对其进行扩展是远远不够的,因为每个DAO类都代表一个不同的域类,因此,通用方法签名中使用的类型是不同的(尽管实现是相似的),例:

class OrderDAO {
//save method receive an Order
public void save(Order order){....}
//getAll method return Orders List
public List<Order> getAll(){...}
}class UserDAO{
//save method receive an User
public void save(User user){....}
//getAll method return Users List
public List<User> getAll(){...}
}

泛型如何帮助我们创建具有通用实现的基类,同时又保持方法签名的类型安全?

首先,我们需要使用通用方法定义一个接口

/*** Base interface for CRUD operations and common queries*/
public interface IDaoBase<T> {public List<T> loadAll();public void save(T domain);public void update(T domain);public void delete(T domain);public T get(Serializable id);/*** Get list by criteria* @param detachedCriteria the domain query criteria, include condition and the orders.* @return* */public List<T> getListByCriteria(DetachedCriteria detachedCriteria);public List<T> getListByCriteria(DetachedCriteria detachedCriteria, int offset, int size);
}

请注意,我们利用泛型,因此每个方法签名都有一个类型T,在实现的DAO类中,每个域将是一个具体类型。

第二步是创建一个实现通用功能的抽象类:

public abstract class DaoBase<T> extends HibernateDaoSupport implements IDaoBase<T> {private Class<T> entityClass;@Autowiredpublic void setSession(SessionFactory sessionFactory){this.setSessionFactory(sessionFactory);}public DaoBase() {entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];}public List<T> loadAll(){return getHibernateTemplate().loadAll(entityClass);}public void delete(T domain) {getHibernateTemplate().delete(domain);}public void save(T domain) {getHibernateTemplate().saveOrUpdate(domain);}public void update(T domain) {getHibernateTemplate().merge(domain);}public T get(Serializable id) {T o = (T) getHibernateTemplate().get(entityClass, id);return o;}public List<T> getListByCriteria(DetachedCriteria detachedCriteria,int offset, int size) {return getHibernateTemplate().findByCriteria(detachedCriteria, offset, size);}public List<T> getListByCriteria(DetachedCriteria detachedCriteria) {return getHibernateTemplate().findByCriteria(detachedCriteria);}
}

就是这样!

花一两分钟的时间检查基础对象如何以类型安全的方式实现通用功能。

实施新的DAO时,我们要做的就是:

1.扩展IDaoBase接口的接口

public interface DaoUser extends IDaoBase<User> {//<=Notice the User typing//Add any additional custom methods..public User getbyUsername(String username);public User getbyEmail(String email);
}

2.实现扩展具体类型的DaoBase

//This class has all the common methods, which are type safe for the User class
@Repository("daoUser")
public class DaoUserImpl extends DaoBase<User> implements DaoUser { //<=Notice the User typingpublic User getbyUsername(String username) {
// concrete implmentation       ...}

因此,现在您知道使用泛型有多么强大。 希望它现在不再那么令人恐惧,更容易理解了……

参考: DAO层– Gal Levinsky博客博客中来自我们的JCG合作伙伴 Gal Levinsky的通用救援 。

翻译自: https://www.javacodegeeks.com/2012/08/dao-layer-generics-to-rescue.html

dao层通用封装

dao层通用封装_DAO层–救援通用相关推荐

  1. dao层通用封装_层超类型模式:封装多层系统中的通用实现

    dao层通用封装 Being one of the cornerstones of OOP, Inheritance is pretty much like a doubled-sided door ...

  2. java中dao层命名规范_Dao层 · java开发规范 · 看云

    ##文件命名 >XXMapper.java 对应xml文件命名为XXMapper.xml ##文件 文件应与数据库中表一一对应,有特殊要求的可以一个表对应多个文件,但严禁一个业务一个文件 ##参 ...

  3. SpringBoot - 实践阿里巴巴【Manager 层_通用业务处理层】

    文章目录 规范 对比传统MVC 小栗子 V1.0 传统写法 V2.0 引入Manager层 源码 规范 对比传统MVC 说几个弊端 Service层代码臃肿 Service层易出现大事务,事务嵌套,易 ...

  4. android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...

    摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...

  5. 带分页功能的SSH整合,DAO层经典封装

    任何一个封装讲究的是,使用,多状态. Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然后在继 ...

  6. Linux文件系统之:通用块处理层 ll_rw_block | +往期文章回顾

    </proc 文件系统并使用/proc 进行输入> <Linux虚拟文件系统概述> <Linux文件系统概述:硬盘驱动>通用块设备层>文件系统>虚拟文件 ...

  7. 晒晒我的通用数据访问层

    注意:本文所介绍的框架已有新版本,点击后面链接即可阅读. [ClownFish:比手写代码还快的通用数据访问层] 今天来晒晒我的通用数据访问层. 写了很多年的数据库项目,数据访问嘛,一直是用业务实体+ ...

  8. ClownFish:比手写代码还快的通用数据访问层

    最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...

  9. java ip吸附_IP层的封装(Java的InetAddress类的C++实现)

    IP 层的封装 C++ 通用框架的设计 作者: naven 1 IP 层封装介绍 TCP/UDP 是网络编程的基础技术,分别代表面向连接的稳定的网络通信技术和非连接方式的广播形式的网络通信技术,它们都 ...

最新文章

  1. WEB Application Development Integrator : 应用设置
  2. golang应用日志
  3. 图像识别中卷积神经网络“卷积”的作用
  4. 动态规划训练21 [FatMouse and Cheese HDU - 1078 ]
  5. sql alter表字段处理
  6. Kafka一些参数配置
  7. mysql数据库服务器名_mysql数据库服务器名
  8. python--学习1
  9. (转) C# Async与Await的使用
  10. Eclipse中好用的快捷键
  11. 悟道魔兽世界,《榜样魔兽》横空出世
  12. hypermesh 错误 2005
  13. dnastar拼接反向互补序列_DNAstar 教程
  14. MAX30102 血氧调试笔记
  15. Protocol Buffer 简介
  16. 公路自行车轮市场前景分析及行业研究报告
  17. 已解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart. Verify that you have su
  18. linux安装ati工具,Linux下ATI驱动安装傻瓜安装方法
  19. 吃灰树莓派应用之HomeAssistant安装与Tuya插件应用
  20. fastjson autoType is not support

热门文章

  1. Java压缩技术(五) GZIP相关——浏览器解析
  2. Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件
  3. Redis 的 4 大法宝,2018 必学中间件
  4. js的三元表达式用来替换表格中的颜色
  5. 来自学长同学分享的学习方法
  6. java向数组中插入元素
  7. 二叉树的前中后序查找+思路分析
  8. 转- java单例模式几种实现方式
  9. java设计模式代理模式_Java中的代理设计模式
  10. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...