dao层通用封装_DAO层–救援通用

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层通用封装

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转) Linux 内核运行参数修改——sysctl命令

原文&#xff1a;https://blog.csdn.net/u012707739/article/details/78254241 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff0c;用sysctl可以读取设置超过五百个…

Matlab求平均值函数mean

amean(A,1) %按列平均bmean(A,2) %按行平均cmean(A(:)) %全部平均

HDU 4514 湫湫系列故事——设计风景线

一次dfs判断有没有环 两次dfs求最长路 第一次记录最长路和次长路 第二次求出答案 #include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#define maxn 100010#pragma comment(linker, "/STACK:367…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

Matlab数据标准化

zscore%据说就是原数据减去均值再除以标准差标准回归系数&#xff1a;1、标准化回归系数测度的是对被解释变量的重要性&#xff0c;只有标准化了&#xff0c;才能进行重要性对比。

matlab学习-线性规划

[x,fval,exitflag,output,lambda]linprog(f,a,b,aeq,beq,lb,ub) 其中f、x、b、beq、lb、ub为向量&#xff0c;a、aeq为矩阵。 min zf s.t. a*x<b aeq*xbeq lb<x<ub x:线性规划最优解 fval&#xff1a;线性规划最优值 exitflag&#xff1a;输出标…

bug单的提交

顶头信息 所属产品&#xff0c;所属项目&#xff0c;所属模块&#xff0c;影响版本&#xff0c;当前指派&#xff0c;bug类型&#xff1a;代码错误&#xff0c;界面优化&#xff0c;设计缺陷&#xff0c;性能问题&#xff0c;标准规范&#xff0c;其他&#xff0c;安全相关。bu…

Matlab各种随机数汇总

randn();%正态分布随机数R&#xff1d;normrnd(MU,SIGMA)R&#xff1d;normrnd(MU,SIGMA,m)R&#xff1d;normrnd(MU,SIGMA,m,n) 注&#xff1a;正态分布只需要2个参数。 randn() 是标准正态分布&#xff1b;normrnd()是自己可以指定均数和标准差的正太分布。rand();randi();是…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

使用tinylog 1.1改进您在Java EE应用程序中的登录

tinylog是Java的轻量级日志记录框架。 与Apache Log4j和Logback相反&#xff0c;tinylog由仅80KB的单个JAR文件组成&#xff0c;没有任何依赖性&#xff0c;并且具有静态logger类。 这意味着您无需使用任何样板代码为每个类创建记录器实例。 public static void main(String[]…

一般区域二重、三重积分MATLAB计算方法

这里讨论的计算方法指的是利用现有的MATLAB函数来求解&#xff0c;而不是根据具体的数值计算方法来编写相应程序。目前最新版的2009a有关于一般区域二重积分的计算函数quad2d&#xff0c;但没有一般区域三重积分的计算函数&#xff0c;而NIT工具箱似乎也没有一般区域三重积分的…

搜索时,怎样排除不需要的关键字

初阶搜索最基本的搜索&#xff0c;即查询包含单个关键字的信息。现在&#xff0c;进一步探讨多个关键字以及关键字间不同逻辑关系的查询。搜索结果要求包含两个及两个以上关键字一般搜索引擎需要在多个关键字之间加上“”。示例&#xff1a;搜索所有包含关键词“易筋经”和“吸…

Java集合类框架的基本接口有哪些?

总共有两大接口&#xff1a;Collection 和Map &#xff0c;一个元素集合&#xff0c;一个是键值对集合&#xff1b; 其中List和Set接口继承了Collection接口&#xff0c;一个是有序元素集合&#xff0c;一个是无序元素集合&#xff1b; 而ArrayList和 LinkedList 实现了List接口…

Matlab求对数

Matlab中只是提供了log、log10和log2&#xff0c;其他的都需要换底公式得到。logaBlogB/loga;

C# NTP时间同步类

添加类 NTPClient /// <summary>/// SNTPClient is a C# class designed to connect to time servers on the Internet and/// fetch the current date and time. Optionally, it may update the time of the local system./// The implementation of the protocol is ba…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;…

jaxb需要jar包吗_JAXB –不需要注释

jaxb需要jar包吗似乎有一个误解&#xff0c;认为在模型上需要注释才能使用JAXB&#xff08;JSR-222&#xff09;实现。 事实是&#xff0c;JAXB是例外配置&#xff0c;因此仅当您要覆盖默认行为时才需要注释。 在此示例中&#xff0c;我将演示如何在不提供任何元数据的情况下使…

MATLAB均值和标准差

mean(); %均值std(); %标准差

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…