`

JPA SPRING 泛型DAO

阅读更多
package com.core.support.springSupportDao;

import java.io.Serializable;
import java.util.List;

/**
 * 此泛型DAO来自easyjweb
 * 泛型DAO接口
 */
public interface GenericDAO<T> {

	/**
	 * 根据Id查找一个类型为T的对象。
	 * 
	 * @param id
	 *            传入的ID的值
	 * @return 一个类型为T的对象
	 */
	T get(Serializable id);

	/**
	 * 持久化一个对象,该对象类型为T。
	 * 
	 * @param newInstance
	 *            需要持久化的对象,使用JPA标注。
	 */
	<T>T save(T newInstance);

	/**
	 * 根据对象id删除一个对象,该对象类型为T
	 * 
	 * @param id
	 *            需要删除的对象的id。
	 */
	void delete(Serializable id);

	/**
	 * 更新一个对象,主要用于更新一个在persistenceContext之外的一个对象。
	 * 
	 * @param transientObject
	 *            需要更新的对象,该对象不需要在persistenceContext中。
	 */
	void update(T transientObject);

	/**
	 * 根据对象的一个属性名和该属性名对应的值来查找一个对象。
	 * 
	 * @param propertyName
	 *            属性名
	 * @param value
	 *            属性名对应的值
	 * @return 一个对象,如果在该属性名和值的条件下找到多个对象,则抛出一个IllegalStateException异常
	 */
	T getBy(String propertyName, Object value);
	
	/**
	 * 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找任意类型的对象。
	 * 
	 * @param queryName
	 *            命名查询的名字
	 * @param params
	 *            查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
	 * @param begin
	 *            开始查询的位置
	 * @param max
	 *            需要查询的对象的个数
	 * @return 一个任意对象的List对象,如果没有查到任何数据,返回一个空的List对象。
	 */
	List executeNamedQuery(final String queryName, final Object[] params,
			final int begin, final int max);

	/**
	 * 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找类型为T的对象。
	 * 
	 * @param query
	 *            查询的条件,使用位置参数,对象名统一为obj,查询条件从where后开始。比如:obj.name =
	 *            ?1 and obj.properties = ?2
	 * @param params
	 *            查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
	 * @param begin
	 *            开始查询的位置
	 * @param max
	 *            需要查询的对象的个数
	 * @return 一个该类型对象的List对象,如果没有查到任何数据,返回一个空的List对象。
	 */
	List<T> find(String query, Object[] params, int begin, int max);

	/**
	 * 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找任意类型的对象。
	 * 
	 * @param query
	 *            完整的查询语句,使用位置参数。比如:select user from User
	 *            user where user.name = ?1 and
	 *            user.properties = ?2
	 * @param params
	 *            查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
	 * @param begin
	 *            开始查询的位置
	 * @param max
	 *            需要查询的对象的个数
	 * @return 一个任意对象的List对象,如果没有查到任何数据,返回一个空的List对象。
	 */
	List query(String query, Object[] params, int begin, int max);

	/**
	 * 根据jpql语句执行批量数据更新等操作
	 * 
	 * @param jpql
	 *            需要执行jpql语句
	 * @param params
	 *            语句中附带的参数
	 * @return
	 */
	int batchUpdate(String jpql, Object[] params);

	/**
	 * 执行SQL语句查询
	 * 
	 * @param nnq
	 * @return
	 */
	public List executeNativeNamedQuery(String nnq);
	
	List executeNativeQuery(final String nnq, final Object[] params,
			final int begin, final int max);

	/**
	 * 执行SQL语句
	 * 
	 * @param nnq
	 * @return
	 */
	public int executeNativeSQL(final String nnq);


	
/**
 *  flush()
 */
	public void flush();

}









package com.core.support.springSupportDao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;



import com.core.openstarbbsexception.JPAMothodParameterException;
import com.core.support.springSupportDao.GenericDAO;


public class GenericDAOImpl<T> extends JpaDaoSupport implements GenericDAO<T> {

	private Class<T> clazz;

	public GenericDAOImpl(Class<T> clazz) {
		this.clazz = clazz;
	}

	/*
	 * public void setClazz(Class<T> clazz) { this.clazz = clazz; } public
	 * Class<T> getClazz() { return clazz; }
	 */
	public T get(Serializable id) {
		if (id == null)
			return null;
		return this.getJpaTemplate().find(clazz,id);
	}

	public List<T> find(final String queryStr, final Object[] params,
			final int begin, final int max) {
		// TODO Auto-generated method stub
		List<T> ret = (List<T>) this.getJpaTemplate().execute(
				new JpaCallback() {

					public Object doInJpa(EntityManager em)
							throws PersistenceException {
						// TODO Auto-generated method stub
						String clazzName = clazz.getName();
						StringBuffer sb = new StringBuffer("select obj from ");
						sb.append(clazzName).append(" obj").append(" where ")
								.append(queryStr);
						Query query = em.createQuery(sb.toString());
						int parameterIndex = 1;
						if (params != null && params.length > 0) {
							for (Object obj : params) {
								query.setParameter(parameterIndex++, obj);
							}
						}
						if (begin >= 0 && max > 0) {
							query.setFirstResult(begin);
							query.setMaxResults(max);
						}
						if (begin >= 0 && max > 0) {
							query.setFirstResult(begin);
							query.setMaxResults(max);
						}
						return query.getResultList();
					}
				});
		if (ret != null && ret.size() >= 0) {
			return ret;
		} else {
			return new ArrayList<T>();
		}
	}

	public List query(final String queryStr, final Object[] params,
			final int begin, final int max) {
		// TODO Auto-generated method stub
		List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				// TODO Auto-generated method stub
				Query query = em.createQuery(queryStr);
				int parameterIndex = 1;
				if (params != null && params.length > 0) {
					for (Object obj : params) {
						query.setParameter(parameterIndex++, obj);
					}
				}
				if (begin >= 0 && max > 0) {
					query.setFirstResult(begin);
					query.setMaxResults(max);
				}
				/*
				 * if (begin >= 0 && max > 0) { query.setFirstResult(begin);
				 * query.setMaxResults(max); }
				 */
				return query.getResultList();
			}
		});
		if (ret != null && ret.size() >= 0) {
			return ret;
		} else {
			return new ArrayList();
		}
	}

	public void delete(Serializable id){
		if (id == null)
			try {
				throw new JPAMothodParameterException();
			} catch (JPAMothodParameterException e1) {
				e1.printStackTrace();
			}
		T object = this.get(id);
		if (object != null) {
			try {
				this.getJpaTemplate().remove(object);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public <T> T save(T instance) {
		// TODO Auto-generated method stub
		this.getJpaTemplate().persist(instance);
		return instance;
	}

	public T getBy(final String propertyName, final Object value) {
		if (propertyName == null || "".equals(propertyName) || value == null)
			try {
				throw new JPAMothodParameterException();
			} catch (JPAMothodParameterException e) {
				e.printStackTrace();
			}
				
		// TODO Auto-generated method stub
		List<T> ret = (List<T>) this.getJpaTemplate().execute(
				new JpaCallback() {

					public Object doInJpa(EntityManager em)
							throws PersistenceException {
						// TODO Auto-generated method stub
						String clazzName = clazz.getName();
						StringBuffer sb = new StringBuffer("select obj from ");
						sb.append(clazzName).append(" obj");
						Query query = null;
						if (propertyName != null && value != null) {
							sb.append(" where obj.").append(propertyName)
									.append(" = :value");
							query = em.createQuery(sb.toString()).setParameter(
									"value", value);
						} else {
							query = em.createQuery(sb.toString());
						}
						return query.getResultList();
					}
				});
		if (ret != null && ret.size() == 1) {
			return ret.get(0);
		} else if (ret != null && ret.size() > 1) {
			throw new java.lang.IllegalStateException(
					"worning  --more than one object find!!");
		} else {
			return null;
		}
	}

	public List executeNamedQuery(final String queryName,
			final Object[] params, final int begin, final int max) {
		List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				Query query = em.createNamedQuery(queryName);
				int parameterIndex = 1;
				if (params != null && params.length > 0) {
					for (Object obj : params) {
						query.setParameter(parameterIndex++, obj);
					}
				}
				if (begin >= 0 && max > 0) {
					query.setFirstResult(begin);
					query.setMaxResults(max);
				}
				return query.getResultList();
			}
		});
		if (ret != null && ret.size() >= 0) {
			return ret;
		} else {
			return new ArrayList();
		}
	}

	public void update(T instance) {
		// TODO Auto-generated method stub
		this.getJpaTemplate().merge(instance);
	}

	public void setClazzType(Class clazz) {
		this.clazz = clazz;
	}

	public Class getClassType() {
		return this.clazz;
	}

	public List executeNativeNamedQuery(final String nnq) {
		Object ret = this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				Query query = em.createNativeQuery(nnq);
				return query.getResultList();
			}
		});
		return (List) ret;
	}

	public List executeNativeQuery(final String nnq, final Object[] params,
			final int begin, final int max) {
		List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				Query query = em.createNativeQuery(nnq);
				int parameterIndex = 1;
				if (params != null && params.length > 0) {
					for (Object obj : params) {
						query.setParameter(parameterIndex++, obj);
					}
				}
				if (begin >= 0 && max > 0) {
					query.setFirstResult(begin);
					query.setMaxResults(max);
				}
				return query.getResultList();
			}
		});
		if (ret != null && ret.size() >= 0) {
			return ret;
		} else {
			return new ArrayList();
		}
	}

	public int executeNativeSQL(final String nnq) {
		Object ret = this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				Query query = em.createNativeQuery(nnq);
				return query.executeUpdate();
			}
		});
		return (Integer) ret;
	}

	public int batchUpdate(final String jpql, final Object[] params) {
		Object ret = this.getJpaTemplate().execute(new JpaCallback() {

			public Object doInJpa(EntityManager em) throws PersistenceException {
				Query query = em.createQuery(jpql);
				int parameterIndex = 1;
				if (params != null && params.length > 0) {
					for (Object obj : params) {
						query.setParameter(parameterIndex++, obj);
					}
				}
				return query.executeUpdate();
			}
		});
		return (Integer) ret;
	}


	public void flush() {
		this.getJpaTemplate().execute(new JpaCallback() {
		public Object doInJpa(EntityManager em) throws PersistenceException {
			em.getTransaction().commit();
			return null;
			}
		});
	}
}



package com.core.openstarbbsexception;

/**
 * OpenStarBBS自定义异常。
 * @author treblesoftware
 *
 */
public class JPAMothodParameterException extends Exception {
	
	public JPAMothodParameterException(){
	super("JPA ORM SUPPORT EXCEPTION:com.core.support.dao.GenericDAOImpl 方法参数为NULL。错误"?);
	}
}
分享到:
评论
3 楼 hesai_vip 2013-05-31  
 
2 楼 treblesoftware 2010-04-16  
sky3380 写道
楼主用过吗,Spring2.5的JPA是没法用泛型的


不好意思,版本忘记了,很久以前的事情了。不过我跑起来的。
1 楼 sky3380 2010-04-16  
楼主用过吗,Spring2.5的JPA是没法用泛型的

相关推荐

    泛型DAO模式在Java Web开发中的应用.pdf

    本文将详细介绍泛型DAO模式在Java Web开发中的应用,包括泛型机制、JPA框架、Struts框架和Spring框架的使用。 一、泛型机制 Java 5.0版本引入了泛型机制,提供了一种解决方案,使用类型参数来代替Object类型的变量...

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    Java Web程序运用中泛型DAO的作用.zip

    在实际的Java Web应用中,我们可以结合Spring框架的Hibernate或JPA支持,进一步简化泛型DAO的实现,利用Spring的模板类如JdbcTemplate、HibernateTemplate等,自动处理SQL执行和结果映射。 总的来说,泛型DAO在Java...

    SSH2全注解整合(spring2.5+hibernate3.3+struts2.1+泛型DAO+proxool连接池)

    泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...

    SpringBoot使用Spring-data-jpa简化数据访问层

    对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写...Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。

    JPA+Spring2.0+EasyJWeb技术构架在企业级系统中的应用.ppt

    目录 企业级应用的特点 JPA及JPA使用技巧 使用泛型DAO来简化DAO层的开发 IOC容器、AOP及Spring2 EasyJWeb如何实现快速开发 小结

    spring3.1+hibernate4+Jpa Dao

    综上所述,"spring3.1+hibernate4+jpa Dao"的集成是一个高效、灵活的企业级应用开发架构,它结合了Spring的IoC和AOP能力、Hibernate的ORM功能以及JPA的标准接口,通过泛型DAO实现和事务管理,为开发者提供了强大的...

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    SSH泛型代码实例

    - `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...

    Persistence with Spring

    - 泛型DAO:利用Java的泛型特性,创建可复用的DAO,减少代码冗余。 5. **Spring与JPA的事务管理** - 无XML配置事务:使用`@EnableTransactionManagement`注解,配合`@Transactional`注解在方法级别定义事务。 - ...

    springDataJpa+mysql+layui前后端分离.zip

    SpringDataJpa通过泛型接口和注解,大大简化了数据库操作,开发者无需编写大量的DAO层代码,即可实现对数据库的CRUD操作。它支持多种ORM框架,如Hibernate和MyBatis,使得开发者可以根据项目需求灵活选择。 Mysql...

    springmvc-jpa-springdata:使用Hibernate作为JPA实现和PostgreSQL数据库的Spring Data

    对于JPA,Spring Data通过泛型 Repository 接口提供了一种声明式的方法来执行CRUD(创建、读取、更新、删除)操作,减少了手动编写DAO(数据访问对象)和Repository层的代码。 **PostgreSQL** PostgreSQL是一种开源...

    Spring数据JPA - 中文参考文档

    JPA 允许开发者使用注解来定义实体对象及其数据库行为,减少了手动编写 SQL 和 DAO 类的需求。在 Spring 中,JPA 与 Spring Data 结合,进一步简化了数据访问层的开发。 4. 使用 Spring 数据存储库 Spring Data ...

    基于javaConfig的springDataJpa+dubbo+springMvc搭建(二)

    通过提供泛型接口Repository,开发者无需编写大量的DAO层代码,就能实现对数据库的基本操作,如增删查改。在JavaConfig中,我们需要定义一个配置类,使用`@EnableJpaRepositories`注解来启用JPA仓库,并通过`@Bean`...

    Spring-Data-JPA快速使用

    - **自定义方法**:通过在DAO接口中定义方法名遵循一定规则(如 `findByName(String name)`),Spring Data JPA 能够自动识别并生成相应的实现。 #### 五、总结 Spring Data JPA 通过提供一套简单而强大的API,极...

    Spring Boot中使用Spring-data-jpa实现数据库增删查改

    通过这种方式,Spring Data JPA会自动为你生成接口的实现,你无需编写任何DAO层的实现类。只需注入Repository接口,就可以直接调用方法进行数据库操作。这种接口式的编程方式极大地提高了代码的可读性和可维护性。 ...

    springmvc+hibernate+spring maven案例(包含分页查询)

    Spring MVC、Hibernate 和 Spring 是Java开发中非常流行的三大框架,它们分别用于Web应用的视图控制器、对象关系映射和依赖注入。这个压缩包提供的案例是这三个框架的整合使用,涵盖了基本的CRUD(创建、读取、更新...

    generic-dao:使用泛型提供基于 Hibernate 的 DAO 层,因此它可以与任何 Hibernate 域对象一起使用

    通用道在 JPA/HIbernate/Spring 环境中使用泛型提供 DAO API,因此它可以与此类架构中的任何 Hibernate POJO 一起使用,而无需为每个域类创建专用的数据访问接口。 Maven 依赖项: &lt;dependency&gt; &lt;groupId&gt;org....

Global site tag (gtag.js) - Google Analytics