ssh框架操作数据库的通用Dao层代码

我写的,可能很多人都做过,希望能给一些编程的人带来方便。

这是一个通用的抽象类,继承他就可调用其中的操作数据库的方法:


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) {//删除,要包含主键

        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即可。



转载于:https://my.oschina.net/u/1995359/blog/327247

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值