一个泛型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包列表如下:

 

猜你喜欢

转载自tanlan.iteye.com/blog/1124673