我写的,可能不少人都作过,但愿能给一些编程的人带来方便。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便可。数据库