`
tanlan
  • 浏览: 203399 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

一个泛型DAO例子

阅读更多

自从Java支持泛型后,使用ORM框架编写DAO的时候就可以结合泛型写出更简洁的代码。

    下面的小例子展示了使用Spring与JPA集成的环境下DAO的编写方法。

    开发测试环境:jdk1.6,Spring3.0.5,Hibernate3.6.2,MySQL5.5,MyEclispe9.0

数据库表结构

 

Sql代码 
  1. create table TUser(  
  2.     id char(32) primary key,  
  3.     name char(20)  
  4. )  

 创建一个纯Java工程

  需要引入相应的jar文件,

 在src的META-INF下编写persistence.xml

 <?xml version="1.0" encoding="UTF-8"?>

Xml代码 
  1. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
  4. http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"  
  5.     version="2.0">  
  6.     <persistence-unit name="demo"/>  
  7. </persistence>  

 编写实体类并加上注解

 

Java代码 
  1. package com.tanlan.entity;  
  2.   
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.Table;  
  7.   
  8. import org.hibernate.annotations.GenericGenerator;  
  9.   
  10. @Entity  
  11. @Table(name="TUser")  
  12. public class User {  
  13.     @Id  
  14.     @GenericGenerator(name="cuuid",strategy="uuid")  
  15.     @GeneratedValue(generator="cuuid")  
  16.     private String id;  
  17.     private String name;  
  18.   
  19.     public String getId() {  
  20.         return id;  
  21.     }  
  22.   
  23.     public void setId(String id) {  
  24.         this.id = id;  
  25.     }  
  26.   
  27.     public String getName() {  
  28.         return name;  
  29.     }  
  30.   
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34.   
  35. }  

 定义父DAO

 该接口中定义共有方法,增删改查

 

Java代码 
  1. package com.tanlan.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. public interface DAO<PK,E> {  
  6.     void persist(E entity);  
  7.     void remove(E entity);  
  8.     E findById(PK id);  
  9.     List<E> getAll();  
  10. }  

 定义UserDAO接口

该接口声明了其他非公用方法

 package com.tanlan.dao;

Java代码 
  1. import com.tanlan.entity.User;  
  2.   
  3. public interface UserDAO extends DAO<String, User> {  
  4.     void otherMethod1();  
  5.     int otherMethod2();  
  6. }  

 实现公用方法

 

Java代码 
  1. package com.tanlan.dao;  
  2.   
  3. import java.lang.reflect.ParameterizedType;  
  4. import java.util.List;  
  5.   
  6. import org.springframework.orm.jpa.support.JpaDaoSupport;  
  7.   
  8.   
  9. public class JpaDAO<PK, E> extends JpaDaoSupport implements DAO<PK, E> {  
  10.     protected Class<E> entityClass;  
  11.   
  12.     @SuppressWarnings("unchecked")  
  13.     public JpaDAO() {  
  14.         ParameterizedType genericSuperclass = (ParameterizedType) getClass()  
  15.                 .getGenericSuperclass();  
  16.         this.entityClass = (Class<E>) genericSuperclass  
  17.                 .getActualTypeArguments()[1];  
  18.     }  
  19.   
  20.     public void persist(E entity) {  
  21.         getJpaTemplate().persist(entity);  
  22.     }  
  23.   
  24.     public void remove(E entity) {  
  25.         getJpaTemplate().remove(entity);  
  26.     }  
  27.   
  28.     public E findById(PK id) {  
  29.         return getJpaTemplate().find(entityClass, id);  
  30.     }  
  31.   
  32.     public List<E> getAll() {  
  33.         return getJpaTemplate().find("from " + entityClass.getName());  
  34.     }  
  35. }  

 实现非公用方法的类

 

Java代码 
  1. package com.tanlan.dao;  
  2.   
  3. import com.tanlan.entity.User;  
  4.   
  5. public class UserJpaDAO extends JpaDAO<String, User> implements UserDAO {  
  6.   
  7.     @Override  
  8.     public void otherMethod1() {  
  9.         // TODO Auto-generated method stub  
  10.     }  
  11.   
  12.     @Override  
  13.     public int otherMethod2() {  
  14.         // TODO Auto-generated method stub  
  15.         return 0;  
  16.     }  
  17.   
  18. }  

 编写Spring配置文件application.xml

 

Xml代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  7.    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.    http://www.springframework.org/schema/aop  
  9.    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  10.    http://www.springframework.org/schema/tx  
  11.    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  12.     <bean id="datasource"  
  13.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  14.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  15.         <property name="url" value="jdbc:mysql://localhost/test" />  
  16.         <property name="username" value="root" />  
  17.         <property name="password" value="tanlan"></property>  
  18.     </bean>  
  19.     <bean id="entityManageFactrory"  
  20.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  21.         <property name="dataSource" ref="datasource" />  
  22.         <property name="jpaVendorAdapter">  
  23.             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
  24.                 <property name="database" value="MYSQL" />  
  25.                 <property name="generateDdl" value="false" />  
  26.                 <property name="showSql" value="true" />  
  27.             </bean>  
  28.         </property>  
  29.     </bean>  
  30.     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
  31.         <property name="entityManagerFactory" ref="entityManageFactrory" />  
  32.     </bean>  
  33.   
  34.     <bean id="userDAO" class="com.tanlan.dao.UserJpaDAO">  
  35.         <property name="entityManagerFactory" ref="entityManageFactrory" />  
  36.     </bean>  
  37.       
  38.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  39.         <tx:attributes>  
  40.             <tx:method name="get*" propagation="SUPPORTS" read-only="true"  />  
  41.             <tx:method name="*" propagation="REQUIRED" />  
  42.         </tx:attributes>  
  43.     </tx:advice>  
  44.      <aop:config>  
  45.             <aop:advisor advice-ref="txAdvice"  
  46.                 pointcut="execution(* *..DAO.*(..))" />  
  47.         </aop:config>  
  48. </beans>  

 测试代码如下:

 

Java代码 
  1. package com.tanlan.test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. import com.tanlan.dao.UserDAO;  
  9. import com.tanlan.entity.User;  
  10.   
  11. public class Test {  
  12.   
  13.     public static void main(String[] args) {  
  14.         User newUser=new User();  
  15.         newUser.setName("tanlan");  
  16.           
  17.         ApplicationContext context=new ClassPathXmlApplicationContext("application.xml");  
  18.         UserDAO userDAO=context.getBean("userDAO",UserDAO.class);  
  19.         userDAO.persist(newUser);  
  20.         List<User> users=userDAO.getAll();  
  21.         for (User user : users) {  
  22.             System.out.println(user.getName());  
  23.         }  
  24.   
  25.     }  
  26.   
  27. }  

 今后若要增加对其他表的DAO编写,只需按照此方法增加一个接口与一个类即可,公用的增删改查无需操心。

完整 的jar包列表如下:

 

 

1
1
分享到:
评论

相关推荐

    一个很好的通用泛型dao(含源码)

    而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...

    泛型dao

    对于这些,我们可以进一步扩展泛型DAO,比如引入一个`QueryService`来处理复杂查询,或者提供一个`TransactionService`来管理数据库事务。 至于`XmlDemo`这个文件,它可能包含了一个XML配置文件示例,这在很多Java...

    S2SH整合例子 注解配置 JSON 泛型Dao

    这是一个常见的Java Web开发技术栈,用于构建高效、灵活的企业级应用程序。Struts2提供了MVC架构,Spring提供了依赖注入和事务管理,Hibernate则作为ORM工具处理数据库操作。 1. **Struts2**:Struts2是一个基于MVC...

    spring hibernate 泛型DAO

    泛型DAO是一个通用的DAO实现,它使用Java的泛型特性,可以适用于任何继承自特定基类或者实现特定接口的数据实体类。这样,我们只需要编写一次DAO的通用实现,然后在需要的地方通过指定具体的类型即可。 下面是一个...

    Java Web程序运用中泛型DAO的作用.zip

    而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...

    ssh整合下的通用泛型DAO+分页

    在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...

    再发一个基于Hibernate+Spring 泛型GenericDao 的工程源码.

    描述中提到的“剥离出来的泛型Hibernate”可能是指从一个大型项目中抽取出来的一个独立组件,这个组件专注于泛型DAO的实现,以便在其他项目中复用。博文链接指向的ITEYE博客文章可能详细解释了如何实现这样的泛型DAO...

    SSH泛型代码实例

    - `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...

    SSH笔记-泛型依赖注入

    Spring的泛型依赖注入允许我们声明一个具有类型参数的bean,并在配置文件中指定实际的实现类。例如,我们有一个接口`Service&lt;T&gt;`,以及实现了这个接口的`UserService`和`ProductService`。在Spring配置文件中,我们...

    DAO开发模式介绍.......

    DAO(Data Access Object)开发模式是一种常见的软件设计模式,它主要用于隔离业务逻辑层...不过,在没有使用Spring等框架的情况下,可以自行设计一个简单的IOC容器来管理DAO的创建和事务处理,如上述例子中的DAO工厂。

    自定义Dao,反射实现

    在这个例子中,`BaseDao`是一个抽象基类,它使用了泛型T来表示任何类型的实体。构造函数接收实体类的Class对象,用于获取表名。`insert()`方法使用反射调用`execute()`方法执行SQL,这里省略了具体的JDBC操作细节,...

    ssh数据库基本操作封装

    在这个例子中,`HibernateDaoSupport`是Hibernate提供的一个基类,它提供了与SessionFactory的交互,使得我们可以很方便地进行数据库操作。通过这种方式,我们可以通过泛型来处理不同的实体类,而无需为每个实体类...

    轻量级ORM-Persister使用指南(英文版)

    在这个例子中,我们使用的是泛型DAO(IGenericDao),它专门用于从数据库中读取和写入对象。 `IGenericDao.read()`方法接受一个Java类(如`Employee.class`)和一个SQL查询,然后根据类名、getter和setter方法自动...

    dao-codegen-ts:用于Typescript的数据访问对象代码生成器

    TypeScript是JavaScript的一个超集,它提供了静态类型、接口、类和泛型等高级特性,旨在提高代码的可维护性和可读性。在TypeScript中,数据访问对象(DAO)通常用来封装对数据库的交互,通过抽象出数据库操作,使得...

    springmvc+hibernate+spring maven案例(包含分页查询)

    - "user"可能是数据库中的一个表名,代表用户信息,也可能是指与用户相关的实体类(Entity)或者DAO接口,服务类(Service)和控制器类(Controller)。 总的来说,这个案例提供了一个完整的Java Web开发实践,...

    ssh项目(自定义struts1)

    在实际开发中,一个SSH项目会包含各种配置文件(如struts-config.xml、hibernate.cfg.xml)、Java源代码(Action类、DAO类、Service类等)、JSP页面以及数据库脚本等。开发者通常会利用IDE(如Eclipse或IntelliJ ...

    baseDao及baseDaoImpl将hibernate里面的方法进行合理的封装,使用到java的反射技术

    BaseDao是一个接口,它定义了一系列通用的数据库操作方法,如查询、保存、更新和删除。这些方法是基于Hibernate或其他ORM框架的API设计的。通过在项目中引入BaseDao接口,开发者可以在具体的DAO实现类中重用这些方法...

    JSP语言简短的增删改查

    7. **集合与泛型**:`List&lt;UserInfo&gt;` 是一个Java集合框架中的列表,用于存储多个`UserInfo` 对象。`ArrayList` 是`List` 的一个实现,提供了快速的插入和删除操作。泛型的使用确保了列表中只能包含`UserInfo` 类型...

    Java反射技术的一般应用

    com.jb.arklis.app.DemoApplication类利用反射技术可以观察任何非静态类(比如java.lang.String, javax.swing.JFrame等类和自定义的类,比如com.jb.arklis.dao.BaseDAO)的普通方法、构造方法以公有属性,是一个非常...

Global site tag (gtag.js) - Google Analytics