建立实用且规范的DAO
操作类
J2EE中倡导的应该是面向接口,而不是面向类来编程,因为只有面向接口,才能真正做到层与层之间的解耦。面向接口编程最重要的价值在于隐藏实现,将抽象的实现细节封装起来不对外开放。
在大多数情况下,还需要对抽象类提取必要的接口,简单来做就是,把抽象DAO
类中的方法,全部抽取出来形成一个单独的接口。假如所有
DAO
的操作方法都一样,这样做没问题。但是实际上各个
DAO
类之间,尽管有大量相同的方法,但也总是存在一些不一致的方法,这样一来,问题就来了。我们总不能把接口做的很大吧
....
接口隔离原则(ISP
):使用多个专门的接口比使用单一的总接口好!
实现这个原则的通常的方式有两种:
(1
)使用委托分离接口
(2
)使用多重继承分离接口
具体到抽象DAO
类,我们应该为所有具体的
DAO
类的共性方法抽取到抽象
DAO
类中,并将这些方法抽象为接口,之后再为每个具体的
DAO
类定义接口,在此接口中定义不再抽象
DAO
类中的方法,最后具体的
DAO
类应该继承抽象
DAO
类,同时实现本
DAO
类所对应的接口。通过这样的方式,就可以做到接口的隔离和防止大接口形成的污染了。
具体步骤如下:
1、
先建立一个HibernateSessionFactory
类来实现
Session
的创建与回收。
主要代码见下:
........
publicclassHibernateSessionFactory{
privatestaticStringCONFIG_FILE_LOCATION="/hibernate.cfg.xml";
privatestaticfinalThreadLocal<Session>threadLocal=newThreadLocal<Session>();
privatestaticConfigurationconfiguration=newConfiguration();
privatestaticorg.hibernate.SessionFactorysessionFactory;
privatestaticStringconfigFile=CONFIG_FILE_LOCATION;
static{
try{
configuration.configure(configFile);
sessionFactory=configuration.buildSessionFactory();
}catch(Exceptione){
System.err
.println("%%%%ErrorCreatingSessionFactory%%%%");
e.printStackTrace();
}
}
publicstaticSessiongetSession()throwsHibernateException
{
Sessionsession=(Session)threadLocal.get();
if(session==null||!session.isOpen()){
if(sessionFactory==null){
rebuildSessionFactory();
}
session=(sessionFactory!=null)?sessionFactory.openSession():null;
threadLocal.set(session);
}
returnsession;
}
publicstaticvoidcloseSession()throwsHibernateException
{
Sessionsession=(Session)threadLocal.get();
threadLocal.set(null);
if(session!=null){
session.close();
}
}
............
}
2、
定义一个IBaseHibernateDAO
接口,用来定义每个实体
DAO
类的公共方法,如
getSession()
,
save()
,
delete()
等,然后再建一个
BaseHibernate
类来实现该接口。
public
interface
IBaseHibernateDAO{
public
SessiongetSession();
public
void
save(ObjecttransientInstance);
public
void
delete(ObjecttransientInstance);
}
public
class
BaseHibernateDAO
implements
IBaseHibernateDAO{
public
SessiongetSession(){
return
HibernateSessionFactory.
getSession
();
}
public
void
delete(ObjecttransientInstance)
throws
RuntimeException{
getSession().delete(transientInstance);
}
public
void
save(ObjecttransientInstance)
throws
RuntimeException{
getSession().save(transientInstance);
}
}
3、
设计每个实体DAO
类的时候,先为其定义一个接口,定义其
特有的操作方法
,如:
public
interface
IClientDAO
extends
IBaseHibernateDAO{
public
ClientfindById(java.lang.Stringid);
public
List
findByExample(Clientinstance);
public
List
findByProperty(StringpropertyName,Objectvalue);
public
List
findByCEmail(ObjectCEmail);
public
List
findByCPhone(ObjectCPhone);
public
List
findByCName(ObjectCName);
public
List
findByCSex(ObjectCSex);
public
List
findAll();
public
Clientmerge(ClientdetachedInstance);
public
void
attachDirty(Clientinstance);
public
void
attachClean(Clientinstance);
}
publicclassClientDAOextendsBaseHibernateDAOimplementsIClientDAO{
privatestaticfinalLoglog=LogFactory.getLog(ClientDAO.class);
//propertyconstants
publicstaticfinalString_CEMAIL="CEmail";
publicstaticfinalString_CPHONE="CPhone";
publicstaticfinalString_CNAME="CName";
publicstaticfinalString_CSEX="CSex";
publicvoidsave(ClienttransientInstance){
log.debug("savingClientinstance");
try{
super.save(transientInstance);
log.debug("savesuccessful");
}catch(RuntimeExceptionre){
log.error("savefailed",re);
throwre;
}
}
publicvoiddelete(ClientpersistentInstance){
log.debug("deletingClientinstance");
try{
super.delete(persistentInstance);
log.debug("deletesuccessful");
}catch(RuntimeExceptionre){
log.error("deletefailed",re);
throwre;
}
}
publicClientfindById(java.lang.Stringid){
log.debug("gettingClientinstancewithid:"+id);
try{
Clientinstance=(Client)getSession().get("com.DB.Entity.Client",id);
returninstance;
}catch(RuntimeExceptionre){
log.error("getfailed",re);
throwre;
}
}
publicListfindByExample(Clientinstance){
log.debug("findingClientinstancebyexample");
try{
Listresults=getSession().createCriteria("com.DB.Entity.Client").add(
Example.create(instance)).list();
log.debug("findbyexamplesuccessful,resultsize:"
+results.size());
returnresults;
}catch(RuntimeExceptionre){
log.error("findbyexamplefailed",re);
throwre;
}
}
publicListfindByProperty(StringpropertyName,Objectvalue){
log.debug("findingClientinstancewithproperty:"+propertyName
+",value:"+value);
try{
StringqueryString="fromClientasmodelwheremodel."
+propertyName+"=?";
QueryqueryObject=getSession().createQuery(queryString);
queryObject.setParameter(0,value);
returnqueryObject.list();
}catch(RuntimeExceptionre){
log.error("findbypropertynamefailed",re);
throwre;
}
}
publicListfindByCEmail(ObjectCEmail){
returnfindByProperty(_CEMAIL,CEmail);
}
publicListfindByCPhone(ObjectCPhone){
returnfindByProperty(_CPHONE,CPhone);
}
publicListfindByCName(ObjectCName){
returnfindByProperty(_CNAME,CName);
}
publicListfindByCSex(ObjectCSex){
returnfindByProperty(_CSEX,CSex);
}
publicListfindAll(){
log.debug("findingallClientinstances");
try{
StringqueryString="fromClient";
QueryqueryObject=getSession().createQuery(queryString);
returnqueryObject.list();
}catch(RuntimeExceptionre){
log.error("findallfailed",re);
throwre;
}
}
}
4、建立一个工厂类来对DAO进行统一的管理,该工厂类采用xml文件配置方式来反射生成DAO实例
<p
分享到:
相关推荐
hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
《Eclipse中Hibernate插件深度解析》 在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Eclipse作为主流的Java集成开发环境,其丰富的插件生态使得开发效率得以提升。...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...
通过创建一个新的Hibernate项目,实践从数据库逆向生成实体类,然后利用可视化设计工具调整映射关系,再生成对应的DAO和Service代码,最后进行HQL查询测试,全程体验Hibernate Tools带来的便利。 总结,Hibernate ...
在本文中,我们将深入探讨`hibernate-commons-annotations-5.0.1.Final.jar`的源码,了解其内部结构和主要功能。 一、元数据注解 HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,...
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
hibernate-jpa-2.0-api-1.0.1.Final.jar
Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
`hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...
2. **库文件**:包含jar包,如hibernate-core.jar、hibernate-entitymanager.jar等,这些是我们在项目中引入Hibernate时需要用到的依赖库。 3. **文档**:通常包括用户指南、API文档、开发者文档等,这些文档提供了...
Hibernate稳定版(hibernate-release-5.6.2.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用
列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0.Final.jar hibernate-c3p0-5.1.0.Final.jar hibernate-jpa-2.1-api-...
dao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jar
Hibernate稳定版(hibernate-release-5.4.32.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
很多人为了配置jpa找这个动态产生字节码的jar文件,hibernate-distribution-3.3.1.GA包太大,而hibernate-distribution-3.3.2.GA的jar没有这个jar文件,希望对大家有用
Hibernate Tools的核心功能之一是逆向工程(Reverse Engineering),它可以将现有的数据库结构自动生成对应的Java实体类、Hibernate配置文件以及DAO层代码,极大地简化了项目初始化阶段的工作。在4.1.1版本中,这一...
达梦数据DmDialect-for-hibernate所有jar包,DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-...