一个实现了和数据库打交道的源文件(组装sql语句版)

来源:互联网 发布:淘宝人群画像 编辑:程序博客网 时间:2024/05/21 10:46

package com.itcast.service.base;

import java.util.LinkedHashMap;

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.util.QueryResult;
/**
 * 针对所有实体bean的一个抽象类,所有的实体bean包括ProductType,Product等等
 * @author lucky
 *
 */
@Transactional
public abstract class DaoSupport implements DAO {
 


 @PersistenceContext protected EntityManager em;
 
 //调用下面的public <T> void delete(Class<T> entityClass,Object[] entityids方法
 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);
 }
 /**
  * 可以自动管里主键id的生成,但前提是id是自动生成的
  * 若id是uuid的话,jpa就不支持自动管理逐渐的功能,子类就必须重写该方法,手动添加主键
  */
 public  void save(Object entity) {
  em.persist(entity);

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

 }
 
 @SuppressWarnings("unchecked")
 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
 /**
  * 查询的终极最强版,既可以分页,又可以按序查询,还可以有查询条件,其他的查询都使用这个查询方法
  * orderby 语句格式:order by key1 asc,key2 asc 。用到方法buildOrderby(LinkedHashMap<String, String> orderby)
  * wherejpql 语句格式:where o.property=?1,o.property=?2。用到方法
  */
 public <T> QueryResult<T> getScrollData(Class<T> entityClass,String wherejpql,Object[] queryParams,
   int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
//  if(queryParams != null){
//   System.out.println("=================queryParams length is: " + queryParams.length );
//   for(int i = 0;i<queryParams.length;i++){
//    System.out.println("=================queryParams is " + i +"  " +queryParams[i]);
//   }
//  }
  String entityName = getEntityName(entityClass);
  QueryResult qr = new QueryResult<T>();
  String sql = "select o from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql) + buildOrderby(orderby);
  Query query = em.createQuery(sql);
  setQueryParams(query,queryParams);
  System.out.println("-------------------in DaoSupport :sql is:" + sql);
  /**
   * 1:查询的时候第一步查询到的都是数据表里所有的记录
   * 2:再用query.setFirstResult(firstindex).setMaxResults(maxResult)
   * 方法来设置要显示的首记录(即从哪一条开始显示)和要显示的记录条数
   * 3:然后保存相关数据,方便前台页面显示
   */
  if(firstindex != -1 && maxResult != -1){
   query.setFirstResult(firstindex).setMaxResults(maxResult);
  }
  
  
  qr.setResultList(query.getResultList());
  /**
   * 这里的记录数不是要显示的记录有多少条,而是数据表里一共有多少条记录
   */
  query = em.createQuery("select count(o) from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql));
  
   setQueryParams(query,queryParams);
  
  qr.setTotalrecord((Long)query.getSingleResult());
  return qr;
 }
 
 /**
  * 构建order by 语句
  * orderby 语句格式:order by key1 asc,key2 asc
  * @param orderby
  * @return
  */
 protected String buildOrderby(LinkedHashMap<String, String> orderby){
  StringBuffer orderbySql = new StringBuffer("");
  if(orderby !=null && orderby.size()>0){
   orderbySql.append(" order by ");
   //order by key1 desc,key2 asc
   for(String key:orderby.keySet()){
    orderbySql.append(key).append(" ").append(orderby.get(key)).append(",");
   }
   orderbySql.deleteCharAt(orderbySql.length() - 1);
  }
  return orderbySql.toString();
 }
 
 /**
  * 给where语句设置参数值
  * wherejpql 语句格式:where o.property=?1,o.property=?2。
  * @param query
  * @param params
  */
 protected void setQueryParams(Query query,Object[] params){
  if(params != null && params.length > 0){
   for(int i=0;i<params.length;i++){
//    System.out.println("i+1 = " + (i+1) + " params[i] " + params[i] );
    query.setParameter(i+1, params[i]);
   }
  }
 }
 
 /**
  * 通过反射机制得到一个类的名字
  * @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;
 }

 /**
  * 只对查询的结果进行分页,排序,不过滤
  * @param <T>
  * @param entityClass
  * @param firstindex
  * @param maxResult
  * @param orderby
  * @return
  */
 public <T> QueryResult<T> getScrollData(Class<T> entityClass,
   int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
  // TODO Auto-generated method stub
  return getScrollData(entityClass,null,null,
     firstindex,  maxResult, orderby);
 }
 
 /**
  * 只对查询结果进行分页处理,不排序,也不过滤
  * @param <T>
  * @param entityClass
  * @param firstindex
  * @param maxResult
  * @return
  */

 public <T> QueryResult<T> getScrollData(Class<T> entityClass,
   int firstindex, int maxResult) {
  // TODO Auto-generated method stub
  return getScrollData(entityClass,null,null,
     firstindex,maxResult,null);
 }


 /**
  * 只对查询结果进行分页,过滤,不排序
  * @param <T>
  * @param entityClass
  * @param wherejpql
  * @param queryParams
  * @param firstindex
  * @param maxResult
  * @return
  */
 public <T> QueryResult<T> getScrollData(Class<T> entityClass,
   String wherejpql, Object[] queryParams, int firstindex,
   int maxResult) {
  // TODO Auto-generated method stub
  return getScrollData(entityClass,wherejpql,queryParams,
     firstindex,  maxResult, null);
 }

 /**
  * 查询所有的对象
  * @param <T>
  * @param entityClass
  * @return
  */
 public <T> QueryResult<T> getScrollData(Class<T> entityClass) {
  // TODO Auto-generated method stub
  return getScrollData(entityClass,null,null,
     -1,  -1, null);
 }

 /**
  * 不分页,只过滤
  * @param <T>
  * @param entityClass
  * @param wherejpql
  * @param queryParams
  * @return
  */
 public <T> QueryResult<T> getScrollData(Class<T> entityClass,
   String wherejpql, Object[] queryParams) {
  // TODO Auto-generated method stub
  return getScrollData(entityClass,wherejpql,queryParams,
     -1,  -1, null);
 }

 

}