首先是接口 DAO

package cn.itcast.service.base;

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

import cn.itcast.bean.QueryResult;

public interface DAO<T> {
 /**
  * 获取记录总数
  * @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();
}

然后是实现此接口的抽象类

DaoSupport

package cn.itcast.service.base;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
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 cn.itcast.bean.QueryResult;
import cn.itcast.utils.GenericsUtils;

@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);
 }

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) {
  QueryResult qr = new QueryResult<T>();
  String entityname = getEntityName(this.entityClass);
  Query query = em.createQuery("select o from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "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(this.entityClass)+ ") from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "where "+ wherejpql));
  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;
 }
}

转载于:https://www.cnblogs.com/yaoboyyao/p/3543252.html

分页功能 (包含增删改查)工具类相关推荐

  1. Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码

    Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码 等有时间再慢慢写代码注释吧,先把源码放出来.文章最后有整个项目的压缩包. ps:拓展 Java 原生MySQL JDBC 插入后 ...

  2. mysql增删改查 工具类_Hibernate增删改查数据库之二工具类

    /** * Hibernate工具类(简单型) * 功能-完成会话工厂和会话的创建已经会话的关闭 * @author Owner * */ public class HibernateUtils { ...

  3. mysql增删改查 工具类_JDBC工具类实现对数据库数据的增删改查

    1.先将连接的地址和账号密码放在属性文件中,本地连接直接///代替,java1.6以后自动加载驱动 url = jdbc:mysql:///testdata user =root password= ...

  4. JDBC批量增加批量修改增删改查工具类

    JDBC工具类 package com.belle.infrastructure.util;import java.sql.Connection; import java.sql.PreparedSt ...

  5. 开发平台之美:10分钟内实现一个销售订单功能的增删改查

    IT技术发展了这么多年,早就应该抛弃那些copy&paste的工作了,毫无成就,毫无趣味,毫无好感.这直接催生了一大批快速开发平台的崛起,下面的视频讲述的就是通过一个开发平台如何在10分钟内实 ...

  6. html+js+css 调用jquery 工人信息管理功能(增删改查)前端实现,以及调用实现鼠标拖尾粒子效果的js库

    html + js + css 调用jquery以及underscore.min.js(配合代码实现鼠标粒子效果)实现全前端信息管理基本功能(增删改查) 先附上我运行的一段视频,手机打开清晰一点或者直 ...

  7. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...

    最近看老罗的视频,跟着完成了利用Java操作MySQL数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  8. mysql封装 javabean,利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删改查、JavaBean反射原理,附源码)...

    最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  9. Python写一个账号密码小助手(包含增删改查功能)

    背景 随着现在的应用越来越多,人们注册账号密码的数量也越来越多,很多时候,我都不记得这个平台有没有创建账号密码,这是第一点.还有一点就是,因为很多人不愿意记很多个密码,或者也记不住很多个密码,导致很多 ...

  10. ext2 grid 封装 (包含增删改查 导入导出等操作)

    最近项目又用到ext 比较杯具的是ext版本使用2.0 初步封装了一下grid(还在完善中)              ext技术交流群:164648099 取一行所有信息通用函数 Ext.overr ...

最新文章

  1. labview生成HTML报表,LabVIEW201
  2. 强化学习(十三) 策略梯度(Policy Gradient)
  3. 一个SCSS里mixin的使用例子
  4. IBASE save
  5. 阿姆斯特朗数 matlab,数学实验报告
  6. Codeforce-CodeCraft-20 (Div. 2)-B. String Modification (找规律+模拟)
  7. STL容器的capacity()和reserve()演示-----vector
  8. textarea回车不换行 小程序_微信小程序商城到底值得不值得开通?
  9. OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】
  10. IP地址冲突导致网络故障如何排查问题?
  11. React native真机调试
  12. eda技术试卷_EDA技术试题库-试题库
  13. 如何理解邮件中的“CC、PS、FYI”等英文缩写?
  14. bugzilla dbd-mysql_Redhat 搭建bugzilla平台
  15. 最新数据库驱动包下载(完整版)
  16. php常用单词上传知米背单词,知米背单词APP导入单词列表的操作步骤
  17. 第一章:Swoole结构和流程
  18. 中国智能传感器投资规划建议及前景方向预测报告2022年版
  19. 浏览器的储存方式有哪些
  20. CRS-4544 ORA-09925

热门文章

  1. Leetcode 118:Pascal's Triangle 杨辉三角
  2. sqlserver循环
  3. KindEditor自动过滤首行缩进和全角空格的解决方法
  4. Beginning Adaptive Layout Tutorial
  5. 轻松解决Windows7声卡驱动不全问题
  6. 请还互联网产业一个朗朗乾坤
  7. form表单只提交数据而不进行页面跳转的解决方案
  8. 人们需要更美观的数据中心
  9. tomcat resin nginx处理MIME类型
  10. Spark之SQL解析(源码阅读十)