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便可。数据库

相关文章
相关标签/搜索