我寫的,可能不少人都作過,但願能給一些編程的人帶來方便。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便可。數據庫