ssh框架操做數據庫的通用Dao層代碼

我寫的,可能不少人都作過,但願能給一些編程的人帶來方便。java

這是一個通用的抽象類,繼承他就可調用其中的操做數據庫的方法:spring


package com.zy.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.HibernateTemplate;

import com.zy.bean.Page;

public abstract class DBUtil<T> {//這個泛型的T是在繼承時填寫你要操做的對象的(hibernate生成的對象)
    private Class<T> clazz;
    public void setClazz(Class<T> clazz){
        this.clazz = clazz;
    }
    //對象傳的hql,sql是操做數據庫的語言
    @SuppressWarnings("unchecked")
    public DBUtil(){//這個構造方法是爲了得到T對象的class類的
        //init clazz
        //獲得當前對象的全部實現接口類型
        /*Type types = this.getClass().getGenericSuperclass();*/
        //將獲得的type類型轉化可參數化的類型
        //ParameterizedType type = (ParameterizedType)types;
        //獲得泛型的類型的名字
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        setClazz((Class<T>) pt.getActualTypeArguments()[0]);
    }
    
    
    @Autowired
    HibernateTemplate hibernateTemplate;
    
    public List<Object> findAll(final Page page) {//得到該對象在數據庫全部值,在顯示全部信息列表時用
        return hibernateTemplate.execute(new HibernateCallback<List<Object>>() {

            @SuppressWarnings("unchecked")
            @Override
            public List<Object> doInHibernate(Session session) throws HibernateException {
                Criteria criteria = session.createCriteria(clazz);
                if(page!=null){//分頁的精髓
                    criteria.setFirstResult(page.getBeginIndex());//得到分頁起始點
                    criteria.setMaxResults(page.getEveryPage());}//得到每頁信息數
                return criteria.list();
            }
            
        });
    }
    
    public List<?> findByHql(final String hql, //查詢,經過map傳參,hql操做完成功能(分頁將不在說了)
            final Map<String,Object> params,final Page page) {
    return hibernateTemplate.execute(new HibernateCallback<List<?>>() {

        @Override
        public List<?> doInHibernate(Session session) throws HibernateException {
            Query query = session.createQuery(hql);
            if(params!=null){
                query.setProperties(params);
            }
            if(page!=null){
                query.setFirstResult(page.getBeginIndex());
                query.setMaxResults(page.getEveryPage());
            }
            return query.list();
        }
    });
}
    
    public int getProductCount() { //得到該對象全部信息條數
        List<?> list=hibernateTemplate.find("select count(*) from "+clazz.getName());  
        Number num = (Number) list.get(0);  
         return num.intValue();  
        }
    
        
    public List<Object[]> findBySql(final String sql,final Page page) {//經過sql查詢,解決hql查詢不了的查詢任務
        return hibernateTemplate.execute(new HibernateCallback<List<Object[]>>() {

            @SuppressWarnings("unchecked")
            @Override
            public List<Object[]> doInHibernate(Session session) throws HibernateException {
                //直接使用sql查詢後構造對象
                SQLQuery squery= session.createSQLQuery(sql);
                if(page!=null){
                    squery.setFirstResult(page.getBeginIndex());
                    squery.setMaxResults(page.getEveryPage());
                }
                List<?> list =squery.list();
                List<Object[]> objectList = new ArrayList<Object[]>();
                for(int i=0;i<list.size();i++){
                    Object []obj = (Object[]) list.get(i);
                    objectList.add(obj);
                }
                return objectList;
        }
            });
    }

    
    public void save(T t) {//增長
        hibernateTemplate.save(t);
    }

    public void update(T t) {//更新,要包含主鍵
        hibernateTemplate.saveOrUpdate(t);
    }

    public void delete(T t) {//刪除,要包含主鍵sql

        hibernateTemplate.delete(t);
    }
    
    public void executeExceptSearch(final String hql) {//解決帶參的非查詢任務,sql實現(全部非查詢任務均可實現)
        
         hibernateTemplate.execute(new HibernateCallback<Object>() {
                @Override
                public Object doInHibernate(Session session) throws HibernateException {                                
                    Query query = session.createQuery(hql);                
                    query.executeUpdate();
                    return null;
                }
            });    
    }
         

}
引用時, extends DBUtil<T>將T改成你的對象,因爲個人分頁都有對象page管理,你可將其改了,不用分頁,設對應參數爲null便可。數據庫

相關文章
相關標籤/搜索