自从Java支持泛型后,使用ORM框架编写DAO的时候就可以结合泛型写出更简洁的代码。
下面的小例子展示了使用Spring与JPA集成的环境下DAO的编写方法。
开发测试环境:jdk1.6,Spring3.0.5,Hibernate3.6.2,MySQL5.5,MyEclispe9.0
数据库表结构
- 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"?>
- <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>
编写实体类并加上注解
- 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
该接口中定义共有方法,增删改查
- 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;
- import com.tanlan.entity.User;
- public interface UserDAO extends DAO<String, User> {
- void otherMethod1();
- int otherMethod2();
- }
实现公用方法
- 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());
- }
- }
实现非公用方法的类
- 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 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>
测试代码如下:
- 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包列表如下: