`
longgangbai
  • 浏览: 7326270 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用Hibernate和Spring AOP购建一个范型类型安全的DAO

阅读更多

<hibernate-mapping package="genericdaotest.domain">
     <class name="Person">
         <id name="id">
             <generator class="native"/>
         </id>
         <property name="name" />
         <property name="weight" />
     </class>
 
     <query name="Person.findByName">
         <![CDATA[select p from Person p where p.name = ? ]]>
     </query>
</hibernate-mapping>

 

上面的代码定义了领域类Person的Hibernate映射文件,有两个属性:name和weight。Person是一个具有上面属性的简单的 POJO。这个文件同时包含了一个查询,通过提供的name属性从数据库查找Person实例。Hibernate为命名查询提供了不真实的命名空间功能。为了便于讨论,我将所有的查询名字的前缀变成领域类的的名称。在现实场景中,使用完整的类名,包含包名,是一个更好的主意。
总览

你已经看到了为任何领域对象创建并配置DAO的所需步骤了。这三个简单的步骤就是:

   1. 定义一个接口继承GenericDao并且包含任何所需的finder方法
   2. 在映射文件中为每个领域类的finder方法增加一个命名查询。
   3. 为DAO增加10行Spring配置

可重用的DAO类

Spring advisor和interceptor的功能比较琐碎,事实上他们的工作都引用回了GenericDaoHibernateImpl类。所有带有“find”开头的方法都被传递给DAO的单一方法executeFinder()。

public class FinderIntroductionAdvisor extends DefaultIntroductionAdvisor {
    public FinderIntroductionAdvisor() {
        super(new FinderIntroductionInterceptor());
    }
}
 
public class FinderIntroductionInterceptor implements IntroductionInterceptor {
 
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
 
        FinderExecutor genericDao = (FinderExecutor) methodInvocation.getThis();
 
        String methodName = methodInvocation.getMethod().getName();
        if (methodName.startsWith("find")) {
            Object[] arguments = methodInvocation.getArguments();
            return genericDao.executeFinder(methodInvocation.getMethod(), arguments);
        } else {
            return methodInvocation.proceed();
        }
    }
 
    public boolean implementsInterface(Class intf) {
        return intf.isInterface() && FinderExecutor.class.isAssignableFrom(intf);
    }
}

executeFinder() 方法

上面的代码唯一缺的就是executeFinder的实现。这个代码观察被调用的类的名字和方法,并且将他们与Hibernate的查询名相匹配。你可以使用一个FinderNamingStrategy来激活其他方式的命名查询。默认的实现查找一个名为 “ClassName.methodName”的查询,ClassName是除包名之外的类名。

public List<T> executeFinder(Method method, final Object[] queryArgs) {
     final String queryName = queryNameFromMethod(method);
     final Query namedQuery = getSession().getNamedQuery(queryName);
     String[] namedParameters = namedQuery.getNamedParameters();
     for(int i = 0; i < queryArgs.length; i++) {
             Object arg = queryArgs[i];
             Type argType =  namedQuery.setParameter(i, arg);
      }
      return (List<T>) namedQuery.list();
}
 
public String queryNameFromMethod(Method finderMethod) {
     return type.getSimpleName() + "." + finderMethod.getName();
}

 

总结

在Java 5之前,Java语言并不支持代码同时具有类型安全和范性的特性;你不得不二者选一。在这篇文章里,你可以看到使用Java 5范型支持并且结合Spring和Hibernate(和AOP)一起来提高生产力。一个范型类型安全的DAO类非常容易编写,所有你需要做的就是一个接口,一些命名查询,并且10行Spring配置,并且可以极大的减少错误,同时节省时间。

 

 

 

转载网站:

http://www.ibm.com/developerworks/java/library/j-genericdao.html

分享到:
评论

相关推荐

    SpringAOP整合Hibernate并使用事务(模拟买书的过程)

    通过以上步骤,我们可以成功地整合Spring AOP和Hibernate,利用事务管理实现一个安全、可靠的数据操作流程。这个示例展示了AOP和ORM结合在实际项目中的强大功能,以及它们如何简化和优化企业级应用的开发。

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    当一个方法被标记为@Transactional,Spring会在方法执行前后自动处理事务的开始和结束,如果出现异常,Spring会自动回滚事务,否则在方法正常结束时提交事务。 例如,你可以在一个Service类的配置中写入如下代码: ...

    Spring+hibernate+junit+aop_ jar包

    标题中的"Spring+Hibernate+junit+aop"是一个经典的Java企业级开发组合,这些技术都是Java后端开发中的重要组成部分。让我们逐一深入理解这些知识点: 1. **Spring**:Spring 是一个开源的应用框架,核心功能包括...

    SpringMVC+springAOP+spring security+Hibernate整合实例代码

    Spring MVC、Spring AOP、Spring Security和Hibernate是Java开发中常用的四大框架,它们各自负责不同的领域,但在实际项目中往往需要进行整合以实现更高效、更安全的开发。本实例代码提供了一个完整的整合示例,涵盖...

    spring AOP依赖三个jar包

    1. aopalliance-1.0.jar:这是一个非常基础的AOP库,定义了AOP的核心接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`,这些接口为不同的AOP框架提供了统一的交互方式。Spring...

    hibernate和spring整合Java项目

    Spring是一个全面的企业级应用开发框架,核心特性包括依赖注入、面向切面编程(AOP)以及一系列的模块,如Spring MVC、Spring Data、Spring Security等。Spring的DI机制使得组件间的依赖关系得以解耦,提高了代码的...

    SpringAOP整合Hibernate并使用事务

    HibernateTemplate是Spring提供的一个便捷工具,它封装了SessionFactory的一些常用操作,如保存、更新、删除和查询等,可以减少手动处理Session的代码。 5. **事务配置** 在Spring配置文件中,使用`...

    springAOP所需jar包

    总的来说,Spring AOP提供了一个灵活且强大的平台,用于实现非侵入式的面向切面编程,简化了业务代码,提高了代码的模块化和可维护性。正确理解和使用这些jar包,将能更好地利用Spring AOP实现应用的解耦和扩展。

    spring AOP入门教程

    在编程领域,Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它为开发者提供了一种强大的方式来管理横切关注点,如日志、事务管理、安全性等。本教程将带你了解Spring ...

    Struts2+hibernate+spring整合泛型DAO

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各司其职,共同构建了一个强大的企业级应用体系。Struts2作为MVC(Model-View-Controller)框架,负责处理请求和展现视图;Hibernate是对象关系映射...

    hibernate与spring整合demo

    Hibernate是一个对象关系映射(ORM)工具,它简化了数据库操作,而Spring则是一个全面的企业级应用框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性。将Hibernate与Spring整合可以充分...

    hibernate3.0和spring结合(一看就懂)

    在【压缩包子文件的文件名称列表】中,只有一个文件名“hibernateSpring”。这可能是一个包含整个项目源代码和配置文件的文件夹,里面可能有以下几个关键部分: 1. **pom.xml**:Maven的项目对象模型文件,用于管理...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用03

    Spring还包含了数据访问抽象,如JDBC模板和DAO支持,以及对Hibernate的集成,方便在Spring环境中使用Hibernate。此外,Spring MVC是Spring提供的一个Web MVC框架,可以与Struts2协同工作,提供另一种实现MVC设计模式...

    使用Struts + Spring + Hibernate完成用户登陆笔记

    * 使用Spring框架来实现依赖注入和AOP,例如使用Spring的HibernateDaoSupport来实现DAO层的开发。 六、系统优点 * 使用Struts、Spring和Hibernate三种技术可以实现一个灵活、可维护和高效的用户登陆系统。 * 系统...

    hibernate-aop

    【hibernate-aop】是将面向切面编程(Aspect Oriented Programming,AOP)的概念应用于Hibernate框架的一个项目。在Java开发中,Hibernate是一个强大的对象关系映射(Object-Relational Mapping,ORM)工具,它使得...

    Spring AOP 日志管理 实例

    Spring AOP 日志管理 实例LoggingThrowsAdvice.java

    spring_aop.rar_spring-dao

    本资源“spring_aop.rar_spring-dao”是一个关于Spring AOP(面向切面编程)和Spring DAO(数据访问对象)的实例,旨在帮助开发者理解如何在Spring框架下实现AOP的控制反转,并有效地进行DAO层的操作。 首先,我们...

    使用Spring AOP对异常进行统一处理

    3.处理日志时,需要在每一个try-catch块包含一些处理代码,有时候异常处理的代码比正常执行代码还多,污染正常执行代码。 4.同样类型异常有不同的处理方式,使最终的处理变得复杂。 5.接口抛出异常,破坏封装,打破...

    使用myeclipse集成struts,hibernate,spring的一个示例程序

    【使用MyEclipse集成Struts、Hibernate、Spring的示例程序】 在Java企业级应用开发中,曾经EJB因其强大的功能和复杂的配置而备受关注。然而,随着Java开源项目的崛起,开发者有了更多轻量级的选择,例如Struts、...

Global site tag (gtag.js) - Google Analytics