自从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() {
-
- }
-
- @Override
- public int otherMethod2() {
-
- 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包列表如下:
分享到:
相关推荐
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
对于这些,我们可以进一步扩展泛型DAO,比如引入一个`QueryService`来处理复杂查询,或者提供一个`TransactionService`来管理数据库事务。 至于`XmlDemo`这个文件,它可能包含了一个XML配置文件示例,这在很多Java...
这是一个常见的Java Web开发技术栈,用于构建高效、灵活的企业级应用程序。Struts2提供了MVC架构,Spring提供了依赖注入和事务管理,Hibernate则作为ORM工具处理数据库操作。 1. **Struts2**:Struts2是一个基于MVC...
泛型DAO是一个通用的DAO实现,它使用Java的泛型特性,可以适用于任何继承自特定基类或者实现特定接口的数据实体类。这样,我们只需要编写一次DAO的通用实现,然后在需要的地方通过指定具体的类型即可。 下面是一个...
而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...
在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...
描述中提到的“剥离出来的泛型Hibernate”可能是指从一个大型项目中抽取出来的一个独立组件,这个组件专注于泛型DAO的实现,以便在其他项目中复用。博文链接指向的ITEYE博客文章可能详细解释了如何实现这样的泛型DAO...
- `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...
Spring的泛型依赖注入允许我们声明一个具有类型参数的bean,并在配置文件中指定实际的实现类。例如,我们有一个接口`Service<T>`,以及实现了这个接口的`UserService`和`ProductService`。在Spring配置文件中,我们...
DAO(Data Access Object)开发模式是一种常见的软件设计模式,它主要用于隔离业务逻辑层...不过,在没有使用Spring等框架的情况下,可以自行设计一个简单的IOC容器来管理DAO的创建和事务处理,如上述例子中的DAO工厂。
在这个例子中,`BaseDao`是一个抽象基类,它使用了泛型T来表示任何类型的实体。构造函数接收实体类的Class对象,用于获取表名。`insert()`方法使用反射调用`execute()`方法执行SQL,这里省略了具体的JDBC操作细节,...
在这个例子中,`HibernateDaoSupport`是Hibernate提供的一个基类,它提供了与SessionFactory的交互,使得我们可以很方便地进行数据库操作。通过这种方式,我们可以通过泛型来处理不同的实体类,而无需为每个实体类...
在这个例子中,我们使用的是泛型DAO(IGenericDao),它专门用于从数据库中读取和写入对象。 `IGenericDao.read()`方法接受一个Java类(如`Employee.class`)和一个SQL查询,然后根据类名、getter和setter方法自动...
TypeScript是JavaScript的一个超集,它提供了静态类型、接口、类和泛型等高级特性,旨在提高代码的可维护性和可读性。在TypeScript中,数据访问对象(DAO)通常用来封装对数据库的交互,通过抽象出数据库操作,使得...
- "user"可能是数据库中的一个表名,代表用户信息,也可能是指与用户相关的实体类(Entity)或者DAO接口,服务类(Service)和控制器类(Controller)。 总的来说,这个案例提供了一个完整的Java Web开发实践,...
在实际开发中,一个SSH项目会包含各种配置文件(如struts-config.xml、hibernate.cfg.xml)、Java源代码(Action类、DAO类、Service类等)、JSP页面以及数据库脚本等。开发者通常会利用IDE(如Eclipse或IntelliJ ...
BaseDao是一个接口,它定义了一系列通用的数据库操作方法,如查询、保存、更新和删除。这些方法是基于Hibernate或其他ORM框架的API设计的。通过在项目中引入BaseDao接口,开发者可以在具体的DAO实现类中重用这些方法...
7. **集合与泛型**:`List<UserInfo>` 是一个Java集合框架中的列表,用于存储多个`UserInfo` 对象。`ArrayList` 是`List` 的一个实现,提供了快速的插入和删除操作。泛型的使用确保了列表中只能包含`UserInfo` 类型...
com.jb.arklis.app.DemoApplication类利用反射技术可以观察任何非静态类(比如java.lang.String, javax.swing.JFrame等类和自定义的类,比如com.jb.arklis.dao.BaseDAO)的普通方法、构造方法以公有属性,是一个非常...