首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个泛型DAO例证

2012-09-21 
一个泛型DAO例子自从Java支持泛型后,使用ORM框架编写DAO的时候就可以结合泛型写出更简洁的代码。? ? 下面的

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

一个泛型DAO例证

?

?

热点排行