DAO.java
package com.itcast.service.base;
import java.util.LinkedHashMap;
import com.itcast.bean.QueryResult;
public interface DAO {
/**
* 获取记录总数
* @param entityClass 实体类
* @return
*/
public <T> long getCount(Class<T> entityClass);
/**
* 清除一级缓存的数据
*/
public void clear();
/**
* 保存实体
* @param entity 实体id
*/
public void save(Object entity);
/**
* 更新实体
* @param entity 实体id
*/
public void update(Object entity);
/**
* 删除实体
* @param entityClass 实体类
* @param entityid 实体id
*/
public <T> void delete(Class<T> entityClass, Object entityid);
/**
* 删除实体
* @param entityClass 实体类
* @param entityids 实体id数组
*/
public <T> void delete(Class<T> entityClass, Object[] entityids);
/**
* 获取实体
* @param <T>
* @param entityClass 实体类
* @param entityId 实体id
* @return
*/
public <T> T find(Class<T> entityClass, Object entityId);
/**
* 获取分页数据
* @param <T>
* @param entityClass 实体类
* @param firstindex 开始索引
* @param maxresult 需要获取的记录数
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult
, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby);
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult
, String wherejpql, Object[] queryParams);
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult
, LinkedHashMap<String, String> orderby);
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult);
public <T> QueryResult<T> getScrollData(Class<T> entityClass);
}
DaoSupport.java
package com.itcast.service.base;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
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 com.itcast.bean.QueryResult;
@Transactional
public abstract class DaoSupport implements DAO{
@PersistenceContext protected EntityManager em;
public void clear(){
em.clear();
}
public <T> void delete(Class<T> entityClass,Object entityid) {
delete(entityClass, new Object[]{entityid});
}
public <T> void delete(Class<T> entityClass,Object[] entityids) {
for(Object id : entityids){
em.remove(em.getReference(entityClass, id));
}
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> T find(Class<T> entityClass, Object entityId) {
return em.find(entityClass, entityId);
}
public void save(Object entity) {
em.persist(entity);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> long getCount(Class<T> entityClass) {
return (Long)em.createQuery("select count("+ getCountField(entityClass) +") from "+ getEntityName(entityClass)+ " o").getSingleResult();
}
public void update(Object entity) {
em.merge(entity);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {
return getScrollData(entityClass,firstindex,maxresult,null,null,orderby);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxresult, String wherejpql, Object[] queryParams) {
return getScrollData(entityClass,firstindex,maxresult,wherejpql,queryParams,null);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult) {
return getScrollData(entityClass,firstindex,maxresult,null,null,null);
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass) {
return getScrollData(entityClass, -1, -1);
}
@SuppressWarnings("unchecked")
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult
, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {
QueryResult qr = new QueryResult<T>();
String entityname = getEntityName(entityClass);
Query query = em.createQuery("select o from "+ entityname+ " o "+(wherejpql==null? "": "where "+ wherejpql)+ buildOrderby(orderby));
setQueryParams(query, queryParams);
if(firstindex!=-1 && maxresult!=-1) query.setFirstResult(firstindex).setMaxResults(maxresult);
qr.setResultlist(query.getResultList());
query = em.createQuery("select count("+ getCountField(entityClass)+ ") from "+ entityname+ " o "+(wherejpql==null? "": "where "+ wherejpql));
setQueryParams(query, queryParams);
qr.setTotalrecord((Long)query.getSingleResult());
return qr;
}
protected 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 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 <T>
* @param entityClass 实体类
* @return
*/
protected <T> String getEntityName(Class<T> entityClass){
String entityname = entityClass.getSimpleName();
Entity entity = entityClass.getAnnotation(Entity.class);
if(entity.name()!=null && !"".equals(entity.name())){
entityname = entity.name();
}
return entityname;
}
protected <T> String getCountField(Class<T> 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;
}
}
分享到:
相关推荐
巴巴运动网提供的分页jar包,名为"cn.itcast.page",为开发者提供了一种便捷的方式来实现高效的页面数据展示。本文将详细介绍这个jar包的使用、其在Maven项目中的集成方法以及相关知识点。 一、分页jar包介绍 ...
【cn.itcast.order】是项目代码的命名空间或包名,通常代表了开发团队或公司的标识。在这个项目中,"itcast"可能指的是某教育机构或开发团队,"order"则直指核心功能——订餐服务。开发者可能采用了模块化编程,将...
14-基本资料-布局.itcast
标题“cn.itcast.time”和描述“cn.itcast.time”都指向了可能是一个关于Java编程中的时间处理相关的学习资源。在Java中,处理时间和日期是非常常见的需求,涉及到大量的API和类。这个压缩包可能包含了一个名为...
PHP课程 php.itcast.cn -session保存的其他方法
在这个"php.itcast.cn PHP课程"中,我们将深入探讨两个重要的用户状态管理技术:session和cookie。了解和掌握它们的工作原理对于任何PHP开发者来说都是至关重要的。 首先,让我们从cookie开始。Cookie是由Web服务器...
客户关系管理系统框架搭建: ... * cn.itcast.crm.service.impl:业务层的接口的实现类 * cn.itcast.crm.web.action:struts2的action * cn.itcast.crm.web.form:封装页面数据的javaBean * junit:开发人员测试用的
【标题】"itcast"可能指的是传智播客(ITCAST)这个教育机构,它提供了大量的编程学习资源,包括但不限于Java、Python、前端等技术领域。在这个上下文中,"itcast"可能是某个教学项目的代码库或者课程资料。 【描述...
11-简历编写要求.itcast
09-项目架构介绍.itcast
标题中的"itcast_OA"指的是一个名为"itcast"的机构所开发的OA系统,其网址为"oa.itcast.com",主要功能集中在办公自动化和审批流程上。 【核心模块详解】 1. **岗位管理**:岗位管理是OA系统的基础,用于定义和...
13-补充controller的返回值.itcast
08 自我介绍、项目介绍、测试点(重点).itcast
《基于Java的图书管理系统——深入理解Bookmanager.zip》 在当今信息时代,图书管理系统的开发与应用已经成为图书馆信息化建设的重要组成部分。本系统“Bookmanager.zip”便是一个采用Java编程语言构建的图书管理...
04、数据库设计_北京顺义黑马JavaEE就业163期(20210710面授).itcast
030001A8-909E-40C1-9818-5E19892A072D.itcast
根据提供的信息,我们可以总结出以下有关ITCAST的重要知识点: ### ITCAST概述 #### 定义与定位 ITCAST是一家专注于IT技术教育与培训的服务平台,成立于2007年10月18日。该平台旨在为广大IT学习者提供一个全方位、...
在Web开发中,用户注册是任何网站的基本功能之一,而验证用户输入的数据则是确保系统安全性和数据完整性...学习“php.itcast.cn”的“当当网-用户注册验证”教程,将有助于深入理解这一过程,并提升你的PHP编程技能。
cn.itcast.goods.user.service.UserService; cn.itcast.goods.user.web.servlet.UserServlet。 User类作为实体类需要与数据库表对应,即t_user表对象。而且User类还要用来封装表单数据,所以User类还要与表单对应。...
cn.itcast.elec.service:项目service层,负责操作各个功能模块的业务逻辑 cn.itcast.elec.util:封装系统使用到的公用类的方法和属性 cn.itcast.elec.web.action:系统控制层,负责页面和项目后台的跳转 ...