`

模仿Warp Dynamic Finder的Hibernate Dynamic Dao

阅读更多

看了Robbin前两天发的那帖,Warp framework - 一个相当有前途的Java轻量级Web开发框架(http://www.iteye.com/topic/168780),让人眼前一亮,特别是基于annotation的warp-dynamic-finder部分给人印象非常深刻,利用它,80%情况下Dao的实现不用去写了,只要定义个interface,加几个annotation轻松搞定,自己就着手实现了一个,基于spring的HibernateDaoSupport,其用法也很简单,如下:

Java代码 复制代码
  1. public interface StudentDao {   
  2.     @Save  
  3.     Long save(Student student);   
  4.   
  5.     @Delete  
  6.     void delete(Student student);   
  7.   
  8.     @Get  
  9.     Student get(Long id);   
  10.   
  11.     @Query("from Student as s where s.name = ? and s.age = ?")   
  12.     Student getByNameAndAge(String name, Integer age);//根据参数出现的次序绑定   
  13.   
  14.     @Query("from Student as s where s.age > :age")   
  15.     List<Student> getStudentsAgeMoreThan(   
  16.             @Parameter("age") Integer age);//name绑定   
  17.   
  18.     @Query("from Student as s where s.name like ?")   
  19.     Student getStudentNameLike(   
  20.             @Like(matchMode = MatchMode.START) String name);//支持like   
  21.   
  22.     @Query(value = "delete Student where name = ?", executeUpdate = true)   
  23.     int deleteStudentByName(String name);//批量更新   
  24.   
  25.     @Query("from Student as s order by s.id desc")   
  26.     @Conditions({    
  27.         @Condition("s.name = ?"), //动态条件添加,如果第一个参数不为null,该条件会被插入query string   
  28.         @Condition("s.age = ?")    
  29.     })   
  30.     Student query(String name, Integer age);   
  31.   
  32. }  
public interface StudentDao {
 @Save
 Long save(Student student);

 @Delete
 void delete(Student student);

 @Get
 Student get(Long id);

 @Query("from Student as s where s.name = ? and s.age = ?")
 Student getByNameAndAge(String name, Integer age);//根据参数出现的次序绑定

 @Query("from Student as s where s.age > :age")
 List<Student> getStudentsAgeMoreThan(
   @Parameter("age") Integer age);//name绑定

 @Query("from Student as s where s.name like ?")
 Student getStudentNameLike(
   @Like(matchMode = MatchMode.START) String name);//支持like

 @Query(value = "delete Student where name = ?", executeUpdate = true)
 int deleteStudentByName(String name);//批量更新

 @Query("from Student as s order by s.id desc")
 @Conditions({ 
  @Condition("s.name = ?"), //动态条件添加,如果第一个参数不为null,该条件会被插入query string
  @Condition("s.age = ?") 
 })
 Student query(String name, Integer age);

}



这样一个Dao就定义OK了,非常容易,有两种使用方式,一种是利用AutoInjectDynamicDaoBeanPostProcessor,在spring中的bean初始化好之后,找到有InjectDao标注的方法就,利用动态代理生成StudentDao的代理实现并注入:

Xml代码 复制代码
  1. <bean class="com.norther.dynamic.dao.AutoInjectDynamicDaoBeanPostProcessor">  
  2.     <property name="sessionFactory" ref="sessionFactory" />  
  3. </bean>  
  4.   
  5. <bean id="studentService " class="com.norther.dynamic.dao.test.StudentService" />  
<bean class="com.norther.dynamic.dao.AutoInjectDynamicDaoBeanPostProcessor">
 <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="studentService " class="com.norther.dynamic.dao.test.StudentService" />


 

Java代码 复制代码
  1. public class StudentService {   
  2.   
  3.     private StudentDao studentDao;   
  4.   
  5.     @InjectDao//会被注入StudentDao动态代理实现   
  6.     public void setStudentDao(StudentDao studentDao) {   
  7.         this.studentDao = studentDao;   
  8.     }  
public class StudentService {

 private StudentDao studentDao;

 @InjectDao//会被注入StudentDao动态代理实现
 public void setStudentDao(StudentDao studentDao) {
  this.studentDao = studentDao;
 }



还有另一种方式是基于FactoryBean的DynamicDaoProxy,并自己指定要实现的Dao接口,如下:

Xml代码 复制代码
  1. <bean id="studentDao " class="com.norther.dynamic.dao.DynamicDaoProxy">  
  2.     <property name="dao" value="com.norther.dynamic.dao.test.StudentDao" />  
  3. </bean>  
  4. <bean id="teacherDao " class="com.norther.dynamic.dao.DynamicDaoProxy">  
  5.     <property name="dao" value="com.norther.dynamic.dao.test.TeacherDao" />  
  6. </bean>  
<bean id="studentDao " class="com.norther.dynamic.dao.DynamicDaoProxy">
 <property name="dao" value="com.norther.dynamic.dao.test.StudentDao" />
</bean>
<bean id="teacherDao " class="com.norther.dynamic.dao.DynamicDaoProxy">
 <property name="dao" value="com.norther.dynamic.dao.test.TeacherDao" />
</bean>



非常的简单,也很初级,有什么不足,请大家多多指教,呵呵。

  • dynamicdao.zip (43.4 KB)
  • 描述: 依赖Spring,Hibernate,测试部分依赖EasyMock,SpringMock,HSQLDB,JUnit
分享到:
评论

相关推荐

    blog(guice+hibernate+warp)

    A sample Java web application that demonstrates how &lt;br&gt;Deployment : * Install Dekoh desktop * Start dekoh in interactive mode by executing dekoh_shell.bat / dekoh_shell.sh in directory C:...

    warp-persist-2.0-20090214.zip

    warp-dynamic-finder:提供了基于Annotation的动态查询功能,让数据库查询变得异常简单,不再需要DAO层 warp-mvc:借鉴了Tapestry5,提供了一个基于事件机制和组件化的Web层,并且组件注入方式高度IoC化 warp-...

    Mac Warp IP 优选.zip.cab

    Mac Warp IP 优选.zip.cab

    Warp_Dash_v1.5.1.ipa iphone

    Warp_Dash ipa iphone

    warp 一种快速远程登录软件

    warp 一种快速远程登录软件 warp 一种快速远程登录软件

    relax and timewarp_RELAX_osu_timewarp_

    这款游戏里,“relax”和“timewarp”是两个重要的功能特性,它们分别提供了不同的游戏体验。osu!是一款流行的节奏游戏,玩家需要根据音乐的节奏来点击屏幕上的各种图形,以获得高分。下面我们将深入探讨这两个功能...

    Win Warp IP 优选.rar.cab

    Win Warp IP 优选.rar.cab

    Inter-warp divergence aware execution on GPUs

    在GPU编程领域中,分支问题是一个核心难题,它主要涉及GPU中WARP(线程束)的分支执行。在本文中,作者深入探讨了这一问题,提出了新的优化方案,并取得了显著的研究成果。 首先,我们要了解什么是WARP。WARP是GPU...

    Cloudflare WARP Release-x64.msi

    Cloudflare WARP Release-x64 安装包

    WARP培训资料

    【WARP培训资料】是针对实验室成员,特别是刚刚开始研究生阶段学习的学生,旨在分享和探讨关于WARP(Wireless Open-Access Research Platform)平台的知识。这个平台主要用于FPGA(Field-Programmable Gate Array)...

    IBM OS/2 4Warp VMware 虚拟机 ISO格式

    老古董的IBM OS/2 4warp,用VMware7虚拟机制作的,希望大家喜欢

    Multi Projector Warp System UNITY投影融合软件

    Multi Projector Warp System UNITY投影融合软件 https://assetstore.unity.com/packages/tools/camera/multi-projector-warp-system-75582

    开源项目-spolu-warp.zip

    开源项目 Spolu-Warp 是一个专注于安全且简单终端共享的解决方案。该项目的名称 "warp" 暗示了其核心功能,即快速地在不同设备间“扭曲”(warp)你的终端会话,使得远程协作变得轻而易举。下面我们将详细探讨这个...

    有限元开源代码warp3d_fortran编写

    《有限元开源代码WARP3DFortran编写详解》 在深入探讨有限元开源代码WARP3D Fortran编写之前,我们首先需要了解有限元方法(Finite Element Method, FEM)的基本概念。有限元方法是一种数值计算方法,常用于解决...

    warp_transmit_mimo.rar_RFA_warp_warp mimo

    标题 "warp_transmit_mimo.rar_RFA_warp_warp mimo" 提示我们这是一个与无线通信相关的资源,特别是关于WARP(Wireless Open-Access Research Platform)平台的MIMO(Multiple-Input Multiple-Output)传输代码。...

    Image Warp(利用IDW RBF)

    运用Inverse distance-weighted interpolation method(IDW)和Radial basis function interpolation method(RBF)实现ImageWarp.

    Guice2.0+Hibernate3.2+warp-persist-2.0+Struts2+JPA

    轻量级的Guice2.0代替了Spring,速度更快,项目体积更小,Hibernate3.2与JPA的结合使用代替了传统的配置文件,使Hibernate的开发更简单,本项目基本上是零配置开发,由于我只能上传小于15M的文件,故JAR被我删除了,...

    Go-warp让您通过一个简单的命令安全地共享您的终端

    标题 "Go-warp让您通过一个简单的命令安全地共享您的终端" 涉及到的是一个基于Go语言开发的工具——Warp,它提供了一种便捷且安全的方式,让用户能够通过命令行分享自己的终端会话。这个工具对于远程协作、演示或者...

    Java_非官方的warp客户端android.zip

    Java_非官方的WARP客户端Android项目是一个针对Android平台的第三方实现,允许用户在移动设备上使用WARP技术。WARP(Wireless Application Protocol)是一种通信协议,旨在提高无线网络上的数据传输效率和安全性。非...

Global site tag (gtag.js) - Google Analytics