一个泛型DAO例子
自从Java支持泛型后,使用ORM框架编写DAO的时候就可以结合泛型写出更简洁的代码。
? ? 下面的小例子展示了使用Spring与JPA集成的环境下DAO的编写方法。
? ? 开发测试环境:jdk1.6,Spring3.0.5,Hibernate3.6.2,MySQL5.5,MyEclispe9.0
数据库表结构
?
Sql代码?- create?table?TUser(??
- ????id?char(32)?primary?key,??
- ????name?char(20)??
- )??
?创建一个纯Java工程
? 需要引入相应的jar文件,
?在src的META-INF下编写persistence.xml
?<?xml version="1.0" encoding="UTF-8"?>
Xml代码?- <persistence?xmlns="http://java.sun.com/xml/ns/persistence"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
- ????xsi:schemaLocation="http://java.sun.com/xml/ns/persistence??
- http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"??
- ????version="2.0">??
- ????<persistence-unit?name="demo"/>??
- </persistence>??
?编写实体类并加上注解
?
Java代码?- package?com.tanlan.entity;??
- ??
- import?javax.persistence.Entity;??
- import?javax.persistence.GeneratedValue;??
- import?javax.persistence.Id;??
- import?javax.persistence.Table;??
- ??
- import?org.hibernate.annotations.GenericGenerator;??
- ??
- @Entity??
- @Table(name="TUser")??
- public?class?User?{??
- ????@Id??
- ????@GenericGenerator(name="cuuid",strategy="uuid")??
- ????@GeneratedValue(generator="cuuid")??
- ????private?String?id;??
- ????private?String?name;??
- ??
- ????public?String?getId()?{??
- ????????return?id;??
- ????}??
- ??
- ????public?void?setId(String?id)?{??
- ????????this.id?=?id;??
- ????}??
- ??
- ????public?String?getName()?{??
- ????????return?name;??
- ????}??
- ??
- ????public?void?setName(String?name)?{??
- ????????this.name?=?name;??
- ????}??
- ??
- }??
?定义父DAO
?该接口中定义共有方法,增删改查
?
Java代码?- package?com.tanlan.dao;??
- ??
- import?java.util.List;??
- ??
- public?interface?DAO<PK,E>?{??
- ????void?persist(E?entity);??
- ????void?remove(E?entity);??
- ????E?findById(PK?id);??
- ????List<E>?getAll();??
- }??
?定义UserDAO接口
该接口声明了其他非公用方法
?package com.tanlan.dao;
Java代码?- import?com.tanlan.entity.User;??
- ??
- public?interface?UserDAO?extends?DAO<String,?User>?{??
- ????void?otherMethod1();??
- ????int?otherMethod2();??
- }??
?实现公用方法
?
Java代码?- package?com.tanlan.dao;??
- ??
- import?java.lang.reflect.ParameterizedType;??
- import?java.util.List;??
- ??
- import?org.springframework.orm.jpa.support.JpaDaoSupport;??
- ??
- ??
- public?class?JpaDAO<PK,?E>?extends?JpaDaoSupport?implements?DAO<PK,?E>?{??
- ????protected?Class<E>?entityClass;??
- ??
- ????@SuppressWarnings("unchecked")??
- ????public?JpaDAO()?{??
- ????????ParameterizedType?genericSuperclass?=?(ParameterizedType)?getClass()??
- ????????????????.getGenericSuperclass();??
- ????????this.entityClass?=?(Class<E>)?genericSuperclass??
- ????????????????.getActualTypeArguments()[1];??
- ????}??
- ??
- ????public?void?persist(E?entity)?{??
- ????????getJpaTemplate().persist(entity);??
- ????}??
- ??
- ????public?void?remove(E?entity)?{??
- ????????getJpaTemplate().remove(entity);??
- ????}??
- ??
- ????public?E?findById(PK?id)?{??
- ????????return?getJpaTemplate().find(entityClass,?id);??
- ????}??
- ??
- ????public?List<E>?getAll()?{??
- ????????return?getJpaTemplate().find("from?"?+?entityClass.getName());??
- ????}??
- }??
?实现非公用方法的类
?
Java代码?- package?com.tanlan.dao;??
- ??
- import?com.tanlan.entity.User;??
- ??
- public?class?UserJpaDAO?extends?JpaDAO<String,?User>?implements?UserDAO?{??
- ??
- ????@Override??
- ????public?void?otherMethod1()?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????}??
- ??
- ????@Override??
- ????public?int?otherMethod2()?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????return?0;??
- ????}??
- ??
- }??
?编写Spring配置文件application.xml
?
Xml代码?- <?xml?version="1.0"?encoding="UTF-8"?>??
- <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
- ????xmlns:aop="http://www.springframework.org/schema/aop"??
- ????xmlns:tx="http://www.springframework.org/schema/tx"??
- ????xsi:schemaLocation="http://www.springframework.org/schema/beans????
- ???http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
- ???http://www.springframework.org/schema/aop??
- ???http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
- ???http://www.springframework.org/schema/tx??
- ???http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">??
- ????<bean?id="datasource"??
- ????????class="org.springframework.jdbc.datasource.DriverManagerDataSource">??
- ????????<property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/>??
- ????????<property?name="url"?value="jdbc:mysql://localhost/test"?/>??
- ????????<property?name="username"?value="root"?/>??
- ????????<property?name="password"?value="tanlan"></property>??
- ????</bean>??
- ????<bean?id="entityManageFactrory"??
- ????????class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">??
- ????????<property?name="dataSource"?ref="datasource"?/>??
- ????????<property?name="jpaVendorAdapter">??
- ????????????<bean?class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">??
- ????????????????<property?name="database"?value="MYSQL"?/>??
- ????????????????<property?name="generateDdl"?value="false"?/>??
- ????????????????<property?name="showSql"?value="true"?/>??
- ????????????</bean>??
- ????????</property>??
- ????</bean>??
- ????<bean?id="transactionManager"?class="org.springframework.orm.jpa.JpaTransactionManager">??
- ????????<property?name="entityManagerFactory"?ref="entityManageFactrory"?/>??
- ????</bean>??
- ??
- ????<bean?id="userDAO"?class="com.tanlan.dao.UserJpaDAO">??
- ????????<property?name="entityManagerFactory"?ref="entityManageFactrory"?/>??
- ????</bean>??
- ??????
- ????<tx:advice?id="txAdvice"?transaction-manager="transactionManager">??
- ????????<tx:attributes>??
- ????????????<tx:method?name="get*"?propagation="SUPPORTS"?read-only="true"??/>??
- ????????????<tx:method?name="*"?propagation="REQUIRED"?/>??
- ????????</tx:attributes>??
- ????</tx:advice>??
- ?????<aop:config>??
- ????????????<aop:advisor?advice-ref="txAdvice"??
- ????????????????pointcut="execution(*?*..DAO.*(..))"?/>??
- ????????</aop:config>??
- </beans>??
?测试代码如下:
?
Java代码?- package?com.tanlan.test;??
- ??
- import?java.util.List;??
- ??
- import?org.springframework.context.ApplicationContext;??
- import?org.springframework.context.support.ClassPathXmlApplicationContext;??
- ??
- import?com.tanlan.dao.UserDAO;??
- import?com.tanlan.entity.User;??
- ??
- public?class?Test?{??
- ??
- ????public?static?void?main(String[]?args)?{??
- ????????User?newUser=new?User();??
- ????????newUser.setName("tanlan");??
- ??????????
- ????????ApplicationContext?context=new?ClassPathXmlApplicationContext("application.xml");??
- ????????UserDAO?userDAO=context.getBean("userDAO",UserDAO.class);??
- ????????userDAO.persist(newUser);??
- ????????List<User>?users=userDAO.getAll();??
- ????????for?(User?user?:?users)?{??
- ????????????System.out.println(user.getName());??
- ????????}??
- ??
- ????}??
- ??
- }??
?今后若要增加对其他表的DAO编写,只需按照此方法增加一个接口与一个类即可,公用的增删改查无需操心。
完整 的jar包列表如下:

?
?