package com.chxg.dao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.chxg.entity.PageT;
/**
* Dao层基本方法 包含分页查询 用于Dao实现层继承使用
* 用于Spring集成后使用 sessionFactory 由IOC容器自动注入
* 配置关键点 proxy-target-class="true"
* @author chenxiugen
* @param <T>
*/
public class BaseDao<T> {
private SessionFactory sessionFactory;// 自动注入session工厂
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 获取Session
*
* @return
*/
public Session getSession() {
return this.sessionFactory.getCurrentSession();
}
//获取某一个类的所有数据
//泛型的问题,为什么这里不能使用T.getClass?,可能就跟不能直接new T()是一样的道理,
//需要运行时候才知道
/**
* 查找所有数据 仅限一个实体
* @param clazz 要查找的实体
* @return
*/
public List<T> listAll(Class<T> clazz){
String hql = "from "+clazz.getName();
Query query = getSession().createQuery(hql);
List<T> list = query.list();
return list;
}
//保存指定实体类
public void save(T t){
getSession().save(t);
}
//删除指定实体类
public void delete(T t){
getSession().delete(t);
}
//更新或者保存指定实体
public void saveOrUpdate(T t){
getSession().saveOrUpdate(t);
}
//根据id查找指定实体对象
public T findById(Class<T> clazz, Serializable id){
return (T)getSession().get(clazz,id);
}
//查询指定实体的总记录数
public int getCount(Class<T> clazz){
Query query = getSession().createQuery("select count(*) from "+clazz.getName());
int count = Integer.parseInt(query.uniqueResult().toString());
return count;
}
/**
* 普通分页查找方法一 (无参数)
* @param page 分页查找实体类
* @param clazz 需要查找的实体
* @return
*/
public PageT<T> getPage(PageT<T> page,Class<T> clazz){
//查询总记录数
page.setTotalrow(getCount(clazz));
//分页查询记录结果
List<T> list = findResult(clazz, page.getNowpage(), page.getRowpage());
page.setList(list);
return page;
}
/**
* 查找制定位置开始的制定长度记录
* @param clazz 要查找的实体
* @param begin 开始查找的位置
* @param length 要查找的记录长度
* @return 返回记录结果
*/
public List<T> findResult(Class<T> clazz,int begin,int length){
Query query = getSession().createQuery("from "+clazz.getName());
query.setFirstResult((begin-1)*length);
query.setMaxResults(length);
List<T> list = query.list();
return list;
}
/**
* 带参分页查询方法二 (Map<name,value>)
* @param page 封装分页相关数据 (当前页 每页显示行数)
* @param hql HQL语句 from table t where t.id:id and name:name
* @param map 查询参数 {id:123456,name:chxg}
* @return 分页查询结果
*/
public PageT<T> getPage(PageT<T> page,String hql,Map<String,Object> map){
Query query = getSession().createQuery(hql);
if (map != null)
{
Set<String> keys = map.keySet();
for (String key : keys)
{
query.setParameter(key, map.get(key));
}
}
page.setTotalrow(query.list().size());//总记录数
query.setFirstResult((page.getNowpage() - 1) * page.getRowpage());
query.setMaxResults(page.getRowpage());
page.setList(query.list());
return page;
}
/**
* 带参分页查询(Object[] params = {value1,value2} )
* @param page 封装分页相关数据 (当前页 每页显示行数)
* @param hql HQL语句 from table t where t.id = ? and name = ?
* @param params 查询参数 {123,chxg}
* @return 分页查询结果
*/
public PageT<T> getPage(PageT<T> page,String hql,Object[] params){
Query query = getSession().createQuery(hql);
if (params != null && params.length >0)
{
for(int i = 0; i < params.length; i ++)
{
query.setParameter(i, params[i]);
}
}
page.setTotalrow(query.list().size());
query.setFirstResult((page.getNowpage() - 1) * page.getRowpage());
query.setMaxResults(page.getRowpage());
page.setList(query.list());
return page;
}
/**
* 普通带参查询方法一
* @param <T>
*/
public List<T> getList(String hql,Map<String, Object> map){
List<T> list = new ArrayList<T>();
Query query = getSession().createQuery(hql);
if (map != null)
{
Set<String> keys = map.keySet();
for (String key : keys)
{
query.setParameter(key, map.get(key));
}
}
list = query.list();
return list;
}
/**
* 普通带参查询方法二
* @param hql 形式:from Entity entity where entity.id = ? and entity.name = ?
* @param params 形式:new Object(){111,chxg}
* @return
*/
public List<T> getList(String hql,Object params[]){
List<T> list = null;
Query query = getSession().createQuery(hql);
if (params != null && params.length >0)
{
for(int i = 0; i < params.length; i ++)
{
query.setParameter(i, params[i]);
}
}
list = query.list();
return list;
}
/**
* 带参分页查询(Object[] params = {value1,value2} )
* @param page 封装分页相关数据 (当前页 每页显示行数)
* @param sql SQL语句 select from table t where t.id = ? and name = ?
* @param params 查询参数 {123,chxg}
* @return 分页查询结果
*/
public PageT<T> getPageBySql(PageT<T> page,String sql,Object[] params){
Query query = getSession().createSQLQuery(sql);
if (params != null && params.length >0)
{
for(int i = 0; i < params.length; i ++)
{
query.setParameter(i, params[i]);
}
}
page.setTotalrow(query.list().size());
query.setFirstResult((page.getNowpage() - 1) * page.getRowpage());
query.setMaxResults(page.getRowpage());
page.setList(query.list());
return page;
}
/**
*测试
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BaseDao baseDao = context.getBean("baseDao",BaseDao.class);
/**
* 1(ok)
*/
// System.out.println("Emp 实体对用的记录数:"+baseDao.listAll(Emp.class).size());
/**
* 2 save (ok)
*/
// Emp emp = new Emp();
// emp.setEmpno(7777);
// emp.setEname("chxg");
// baseDao.save(emp);
/**
* 3 del (ok)
*/
// baseDao.delete(emp);
/**
* 4 findById (ok)
*/
// emp = (Emp) baseDao.findById(Emp.class, 7777);
// System.out.println(emp.getEmpno());
/**
* 5 count (ok)
*/
// System.out.println("count:"+baseDao.getCount(Emp.class));;
/**
* 分页 (ok)
*/
// PageT<Emp> page = new PageT<Emp>();
// page.setNowpage(1);
// page.setRowpage(5);
// page = baseDao.getPage(page, Emp.class);
// System.out.println("总记录:"+page.getTotalrow());
// System.out.println(page.getList().get(4).getEmpno());
}
}