`
zhiweiofli
  • 浏览: 515510 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate学习手记(3)--规范的DAO

阅读更多

建立实用且规范的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 jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    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 ...

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中文版.zip

    赠送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依赖信息文件:...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip

    《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-jpa-2.1-api-1.0.0.final-sources.jar 源码

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605

    通过创建一个新的Hibernate项目,实践从数据库逆向生成实体类,然后利用可视化设计工具调整映射关系,再生成对应的DAO和Service代码,最后进行HQL查询测试,全程体验Hibernate Tools带来的便利。 总结,Hibernate ...

    hibernate-commons-annotations-5.0.1.Final.jar

    在本文中,我们将深入探讨`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-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    `hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...

    hibernate-release-5.2.10

    2. **库文件**:包含jar包,如hibernate-core.jar、hibernate-entitymanager.jar等,这些是我们在项目中引入Hibernate时需要用到的依赖库。 3. **文档**:通常包括用户指南、API文档、开发者文档等,这些文档提供了...

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip)

    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-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用

    hibernate.5.1.0.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.jar

    dao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jar

    Hibernate稳定版(hibernate-release-5.4.32.Final.zip)

    Hibernate稳定版(hibernate-release-5.4.32.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-distribution-3.3.1.GA

    很多人为了配置jpa找这个动态产生字节码的jar文件,hibernate-distribution-3.3.1.GA包太大,而hibernate-distribution-3.3.2.GA的jar没有这个jar文件,希望对大家有用

    hibernatetools-Update-4.1.1.zip

    Hibernate Tools的核心功能之一是逆向工程(Reverse Engineering),它可以将现有的数据库结构自动生成对应的Java实体类、Hibernate配置文件以及DAO层代码,极大地简化了项目初始化阶段的工作。在4.1.1版本中,这一...

    DmDialect-for-hibernate1-5.zip

    达梦数据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-...

Global site tag (gtag.js) - Google Analytics