`
GodIT
  • 浏览: 6434 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

JPA(hibernate) Dao 和 DaoSupport

 
阅读更多
package cn.yisi.service.base;

import java.io.Serializable;
import java.util.LinkedHashMap;

import cn.yisi.bean.QueryResult;

public interface DAO<T> {
	
	/**
	 * 
	 * @param id 值 
	 * @param colName  列名
	 * @return
	 */
	public T getByID(String id,String colName);
	
	/**
	 * 获取记录总数
	 * @param entityClass 实体类
	 * @return
	 */
	public long getCount();
	/**
	 * 清除一级缓存的数据
	 */
	public void clear();
	/**
	 * 保存实体
	 * @param entity 实体id
	 */
	public void save(T entity);
	/**
	 * 更新实体
	 * @param entity 实体id
	 */
	public void update(T entity);
	/**
	 * 删除实体
	 * @param entityClass 实体类
	 * @param entityids 实体id数组
	 */
	public void delete(Serializable ... entityids);
	/**
	 * 获取实体
	 * @param <T>
	 * @param entityClass 实体类
	 * @param entityId 实体id
	 * @return
	 */
	public T find(Serializable entityId);
	/**
	 * 获取分页数据
	 * @param <T>
	 * @param entityClass 实体类
	 * @param firstindex 开始索引
	 * @param maxresult 需要获取的记录数
	 * @return
	 */
	public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby);
	
	public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams);
	
	public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby);
	
	public QueryResult<T> getScrollData(int firstindex, int maxresult);
	
	public QueryResult<T> getScrollData();
}




package cn.yisi.service.base;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.yisi.bean.QueryResult;
import cn.yisi.utils.GenericsUtils;
import cn.yisi.utils.WebUtil;

@SuppressWarnings("unchecked")
@Transactional
public abstract class DaoSupport<T> implements DAO<T> {
	protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this.getClass());
	@PersistenceContext
	protected EntityManager em;

	public void clear() {
		em.clear();
	}

	public void delete(Serializable... entityids) {
		for (Object id : entityids) {
			em.remove(em.getReference(this.entityClass, id));
		}
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public T find(Serializable entityId) {
		if (entityId == null)
			throw new RuntimeException(this.entityClass.getName() + ":传入的实体id不能为空");
		return em.find(this.entityClass, entityId);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public T getByID(String id, String colName) {
		String realColName = "id";
		if (!WebUtil.checkNull(colName)) {
			realColName = colName;
		}

		if (id == null || "".equals(id.trim()))
			throw new RuntimeException(this.entityClass.getName() + ":传入的实体id不能为空");
		List<T> list = em.createQuery("select o from " + getEntityName(this.entityClass) + " o where " + realColName + " = ?1").setParameter(1, id).getResultList();
		if (list != null && list.size() == 1) {
			return list.get(0);
		} else {
			return null;
		}

	}

	public void save(T entity) {
		em.persist(entity);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public long getCount() {
		return (Long) em.createQuery("select count(" + getCountField(this.entityClass) + ") from " + getEntityName(this.entityClass) + " o").getSingleResult();
	}

	public void update(T entity) {
		em.merge(entity);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {
		return getScrollData(firstindex, maxresult, null, null, orderby);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams) {
		return getScrollData(firstindex, maxresult, wherejpql, queryParams, null);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData(int firstindex, int maxresult) {
		return getScrollData(firstindex, maxresult, null, null, null);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData() {
		return getScrollData(-1, -1);
	}

	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby) {
		// 测试用--开始
		// System.out.println("wherejpql--->"+wherejpql);
		// for(int i=0;i<queryParams.length;i++){
		// System.out.println("queryParams"+i+"--->"+queryParams[i]);
		// }
		// 测试用--结束

		QueryResult qr = new QueryResult<T>();
		String entityname = getEntityName(this.entityClass);
		String tempSQLWhere = entityname + " o " + (wherejpql == null || "".equals(wherejpql.trim()) ? "" : "where " + wherejpql);
		String tempSQL = "select o from " + tempSQLWhere + buildOrderby(orderby);
		Query query = em.createQuery(tempSQL);
		setQueryParams(query, queryParams);
		if (firstindex != -1 && maxresult != -1) {
			query.setFirstResult(firstindex).setMaxResults(maxresult);
		}
		qr.setResultlist(query.getResultList());
		String tempCountSQL = "select count(" + getCountField(this.entityClass) + ") from " + tempSQLWhere;
		query = em.createQuery(tempCountSQL);
		setQueryParams(query, queryParams);
		qr.setTotalrecord((Long) query.getSingleResult());
		return qr;
	}

	protected static void setQueryParams(Query query, Object[] queryParams) {
		if (queryParams != null && queryParams.length > 0) {
			for (int i = 0; i < queryParams.length; i++) {
				query.setParameter(i + 1, queryParams[i]);
			}
		}
	}

	/**
	 * 组装order by语句
	 * 
	 * @param orderby
	 * @return
	 */
	protected static String buildOrderby(LinkedHashMap<String, String> orderby) {
		StringBuffer orderbyql = new StringBuffer("");
		if (orderby != null && orderby.size() > 0) {
			orderbyql.append(" order by ");
			for (String key : orderby.keySet()) {
				orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");
			}
			orderbyql.deleteCharAt(orderbyql.length() - 1);
		}
		return orderbyql.toString();
	}

	/**
	 * 获取实体的名称
	 * 
	 * @param <E>
	 * @param clazz
	 *            实体类
	 * @return
	 */
	protected static <E> String getEntityName(Class<E> clazz) {
		String entityname = clazz.getSimpleName();
		Entity entity = clazz.getAnnotation(Entity.class);
		if (entity.name() != null && !"".equals(entity.name())) {
			entityname = entity.name();
		}
		return entityname;
	}

	/**
	 * 获取统计属性,该方法是为了解决hibernate解析联合主键select count(o) from Xxx
	 * o语句BUG而增加,hibernate对此jpql解析后的sql为select
	 * count(field1,field2,...),显示使用count()统计多个字段是错误的
	 * 
	 * @param <E>
	 * @param clazz
	 * @return
	 */
	protected static <E> String getCountField(Class<E> clazz) {
		String out = "o";
		try {
			PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
			for (PropertyDescriptor propertydesc : propertyDescriptors) {
				Method method = propertydesc.getReadMethod();
				if (method != null && method.isAnnotationPresent(EmbeddedId.class)) {
					PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
					out = "o." + propertydesc.getName() + "." + (!ps[1].getName().equals("class") ? ps[1].getName() : ps[0].getName());
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return out;
	}
}
分享到:
评论

相关推荐

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    首先,在`pom.xml`文件中添加Spring Boot的JPA、Hibernate和Redis相关依赖,如: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-data-jpa &lt;groupId&gt;org.hibernate ...

    Java Web高级编程 涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security

    Java Web高级编程是一门涵盖多种技术的课程,这些技术包括WebSockets、Spring Framework、JPA(Java Persistence API)以及Hibernate和Spring Security。下面将详细介绍这些知识点。 WebSockets是一种网络通信技术...

    JPA注解 和hibernate 建表

    JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...

    jpa + hibernate 例子

    通过这个简单的例子,开发者可以了解如何在实际项目中整合JPA和Hibernate,以及如何使用JUnit进行测试,确保数据操作的正确性和应用程序的稳定性。同时,这也是学习ORM框架和Java持久化的一个基础起点。

    Spring + JPA + Hibernate配置

    此外,可能还需要编写DAO接口和实现类,使用JPA或Hibernate的API进行数据操作。 通过这篇博文链接(虽然此处未给出实际链接),开发者可以学习到如何将这三个框架集成到一个项目中,包括如何设置相应的Maven或...

    velocity spring jpa hibernate 整合

    在这个项目中,"velocity spring jpa hibernate 整合"涉及到的是四个关键组件:Velocity、Spring、JPA(Java Persistence API)和Hibernate。让我们逐一深入理解这些技术并探讨它们如何协同工作。 1. **Velocity**...

    JPA Hibernate

    JPA Hibernate 帮你详细解释jpa中注解的详细用法 帮你更好的去了解和运用

    JPA和Hibernate的关系

    例如,在实体对象的状态方面,Hibernate定义了“瞬态”、“持久化”和“分离”等状态,而JPA则使用“new”、“managed”、“detached”和“removed”等术语来描述类似的概念。这些相似之处使得从Hibernate迁移到JPA...

    封装JPA的数据操作公共DAO基类

    通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.

    jpa_hibernate项目 所有jar包

    1. **配置**:理解和设置Hibernate和JPA的配置文件,如persistence.xml和hibernate.cfg.xml。 2. **实体映射**:学习如何通过注解或XML文件将Java类映射到数据库表。 3. **CRUD操作**:掌握基本的创建(Create)、...

    HibernateDAO的写法

    而HibernateDAO则是基于Hibernate进行数据访问的对象,是业务逻辑层和持久层之间的桥梁。本文将详细探讨HibernateDAO的实现方式以及常见设计模式,旨在帮助开发者更好地理解和运用这一技术。 1. HibernateDAO的基本...

    spring-data-jpa hibernate

    - 当Spring Data JPA配置了Hibernate作为其JPA供应商时,它会利用Hibernate的实体管理和查询功能。 - Spring Data JPA的Repository接口在底层使用Hibernate的Session来执行查询和操作数据库。 - Spring的事务管理...

    jpa(hibernate 持久层)所需要的jar包

    在使用JPA和Hibernate进行开发时,我们需要一些特定的**jar包**来支持我们的应用程序。这些jar包通常包括以下几个关键部分: 1. **JPA规范**:包含`javax.persistence-api.jar`,这是JPA的官方API,定义了持久化...

    Java Web高级编程 涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security.pdf

    Nicholas S. Williams是Java和相关技术领域的一位著名专家。...Nick大量参与了开源社区工作,为Apache Log4J、Apache Tomcat、Jackon Mapper、Spring Framework和Spring Security等项目贡献了bug修复、新特性和文档。

    JPA与Hibernate的优缺点

    而Hibernate,则是在JPA的基础上进一步扩展,提供了更加丰富和灵活的特性,适合于对性能和灵活性有更高要求的应用场景。选择JPA还是Hibernate,最终取决于项目的具体需求、团队的技术栈以及对性能和维护性的考量。...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    通过Spring Data JPA,我们可以直接通过接口定义来实现对数据库的CRUD操作,无需编写大量的DAO层代码。只需提供一个继承自JpaRepository的接口,即可自动实现基本的查询方法。此外,Spring Data JPA还支持自定义查询...

    spring mvc 与JPA/Hibernate的整合示例

    整合Spring MVC、JPA和Hibernate可以带来很多优势,如松耦合、声明式事务管理、方便的DAO操作等。然而,需要注意的是,这也会增加项目的复杂性,需要合理设计和管理依赖,避免出现过多的配置和代码冗余。 总之,这...

    jpa中hibernate实现相关jar包

    在标题和描述中提到的"jpa中hibernate实现相关jar包"是指一组完整的Hibernate库,这些库可以帮助开发者在项目中集成JPA和Hibernate,实现对数据库的高效操作。 以下是一些关键的Hibernate JPA相关jar包及其作用: ...

Global site tag (gtag.js) - Google Analytics