package com.shlanbao.tzsc.base.dao.impl; import java.io.Serializable; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Repository; import com.shlanbao.tzsc.base.dao.BaseDaoI; import com.shlanbao.tzsc.base.model.PageParams; import com.shlanbao.tzsc.utils.tools.BeanConvertor; import com.shlanbao.tzsc.utils.tools.DateUtil; import com.shlanbao.tzsc.utils.tools.StringUtil; /** * 通用dao实现类 *
  • @author Leejean *
  • @create 2014-6-24 下午04:14:54 * @param 目标类 */ @SuppressWarnings("unchecked") @Repository public class BaseDaoImpl implements BaseDaoI { private Logger log = Logger.getLogger(this.getClass()); private String message="数据库操作异常."; @Autowired private SessionFactory sessionFactory; /** * 获得当前事物的session * * @return org.hibernate.Session */ public Session getCurrentSession() { return this.sessionFactory.getCurrentSession(); } /** * 保存 * @author Leejean * @create 2014-7-5下午12:06:02 * @param o 持久化对象 * @return 执行结果 */ @Override public boolean save(T o){ try { Serializable serializable=this.getCurrentSession().save(o); return serializable==null?false:true; } catch (DataAccessException e) { e.printStackTrace(); log.error(message, e); return false; } } /** * 保存 * @param o 持久化对象 * @return 执行结果 */ @Override public String saveBackKey(T o){ String key =""; try { Serializable serializable=this.getCurrentSession().save(o); key = serializable.toString(); } catch (DataAccessException e) { log.error(message, e); key =""; } return key; } /** * 更新 * @author Leejean * @create 2014-7-5下午12:06:02 * @param o 持久化对象 * @return 执行结果 */ @Override public boolean update(T o){ boolean flag = false; try { this.getCurrentSession().update(o); flag = true; } catch (DataAccessException e) { log.error(message, e); flag = false; } return flag; } /** * 保存或者修改 * @author liuligong * @create 2014-11-10 8:58 * @param o 持久化对象 * @return 执行结果 */ @Override public boolean saveOrUpdate(T o){ try { this.getCurrentSession().saveOrUpdate(o); return true; } catch (DataAccessException e) { e.printStackTrace(); log.error(message, e); return false; } } /** * 根据ID查找对象 * @author Leejean * @create 2014-7-5下午12:06:17 * @param c 目标对象 * @param id ID * @return 对象实例 */ @Override public T findById(Class c,String id) { try { return (T) this.getCurrentSession().get(c, id); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 普通分页查询 * @author Leejean * @create 2014-7-5下午12:08:49 * @param hql HQL * @param pageIndex 当前页 * @param pageSize 页大小 * @param params 参数 * @return 结果集 */ @Override public List queryByPage(String hql, int pageIndex,int pageSize, Object...params) { try { Query query = getQuery(hql); query.setFirstResult((pageIndex-1)*pageSize); query.setMaxResults(pageSize); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 分页查询(适用于Easyui分页) * 局限:排序仅支持单表 * @author Leejean * @create 2014-6-27下午03:39:31 * @param hql HQL 目标表取别名为:o 无需后接空格 如:'from MyTable o' * @param pageParams 分页参数 * @param params 用户输入参数,一般用来自于自定义Bean * @return 结果集 */ @Override public List queryByPage(String hql, PageParams pageParams, Object...params) { try { if(StringUtil.notNull(pageParams.getOrder())&&StringUtil.notNull(pageParams.getSort())){ hql += " order by o." + pageParams.getSort() + " " + pageParams.getOrder(); } Query query = getQuery(hql); query.setFirstResult((pageParams.getPage()-1)*pageParams.getRows()); query.setMaxResults(pageParams.getRows()); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 分页查询带排序功能 * @author Leejean * @create 2014-6-27下午03:39:31 * @param hql HQL语句 * @param pageIndex 页码 * @param pageSize 页大小 * @param sort 排序列 * @param order 升序asc&降序desc * @param params 参数列表 * @return 结果集 */ @Override public List queryByPage(String hql, int pageIndex,int pageSize,String sort,String order, Object... params) { try { if(sort!=null&&!sort.equals("")&&order!=null&&!order.equals("")){ hql += " order by o." + sort + " " + order; } Query query = getQuery(hql); query.setFirstResult((pageIndex - 1) * pageSize); query.setMaxResults(pageSize); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 普通查询 * @param hql HQL语句 * @param params 参数列表 * @return 对象集合 */ @Override public List query(String hql,Object...params) { try { Query query=getQuery(hql); bandParameter(query, params); return (List)query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * */ @SuppressWarnings("hiding") @Override public T query(Class clazz, String hql, Object... params) { try { Query query=getQuery(hql); bandParameter(query, params); return (T)query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } @Override public List queryObjectArray(String hql, Object... params) { try { Query query=getQuery(hql); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } @Override public List queryPageObjectArray(String hql, int pageIndex, int pageSize) { try { Query query = getQuery(hql); query.setFirstResult((pageIndex-1)*pageSize); query.setMaxResults(pageSize); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } @Override public List queryObjectArray(String hql, PageParams pageParams, Object... params) { try { if(StringUtil.notNull(pageParams.getOrder())&&StringUtil.notNull(pageParams.getSort())){ hql += " order by o." + pageParams.getSort() + " " + pageParams.getOrder(); } Query query = getQuery(hql); query.setFirstResult((pageParams.getPage()-1)*pageParams.getRows()); query.setMaxResults(pageParams.getRows()); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 单值查询 * @author Leejean * @create 2014-6-27下午03:39:31 * @param hql * @param params * @return */ @Override public Object unique(String hql,Object...params) { try { Query query=getQuery(hql); bandParameter(query, params); return query.setMaxResults(1).uniqueResult(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 对象查询 */ @Override public T unique(Class c, String hql, Object... params) { try { Query query=getQuery(hql); bandParameter(query, params); return (T) query.setMaxResults(1).uniqueResult(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } /** * 获得Query对象 * @author Leejean * @create 2014-6-27下午03:39:31 * @param hql HQL语句 * @return Query Query对象 */ private Query getQuery(String hql) { Query query=this.getCurrentSession().createQuery(hql); return query; } /** * 绑定参数 * @author Leejean * @create 2014-6-27下午03:39:31 * @param query Query * @param params 如果传入的是 list,中间如果有date类型的需要写成 :list.add("值"+";Date"); */ private void bandParameter(Query query, Object... params) { if(null!=params&¶ms.length>0){ if(params[0].getClass().getName().equals("java.util.ArrayList") ){ List objParams = (List) params[0]; for(int i=0;i1&&"Date".equals(args[1])){ query.setParameter(i,DateUtil.strToDate(String.valueOf(args[0]), "yyyy-MM-dd HH:mm:ss")); }else{ query.setParameter(i,value); } } }else{ for(int i=0;i clazz){ Query query = getQuery("delete from "+clazz.getName()+" o where o.id='"+id+"'"); return query.executeUpdate(); } /** * 按条件删除或修改 * @author Leejean * @create 2014-7-5下午12:05:51 * @param hql * @param params * @return */ @Override public int deleteByParams(String hql, Object... params) { try { Query query = getQuery(hql); bandParameter(query, params); return query.executeUpdate(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return 0; } } /** * SQL拓展查询 * @author Leejean * @create 2014-6-27下午03:39:31 * @param sql SQL语句 * @param params 参数列表 * @return 对象集合 */ @Override public List queryBySql(String sql, Object... params) { try { Query query = this.getCurrentSession().createSQLQuery(sql); bandParameter(query, params); return query.list(); } catch (Exception e) { e.printStackTrace(); log.error(message, e); return null; } } @SuppressWarnings("rawtypes") @Override public void batchInsert(List list,Class clazz) { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { int i=0; for (Object t : list) { Object po=BeanConvertor.copyProperties(t, clazz); session.save(po); if ( i % 20 == 0 ) { //单次批量操作的数目为20 session.flush(); //清理缓存,执行批量插入20条记录的SQL insert语句 session.clear(); //清空缓存中 } i++; } tx.commit(); session.close(); } catch (Exception e) { session.flush(); //清理缓存,执行批量插入20条记录的SQL insert语句 session.clear(); //清空缓存中 tx.rollback(); session.close(); e.printStackTrace(); } } //更新 public int updateBySql(String sql,List obj) { int count = 0; Session session = sessionFactory.openSession(); SQLQuery update = session.createSQLQuery(sql); Transaction tx=session.beginTransaction(); try{ if(null!=obj){ for(int i=0;i obj) { Session session = sessionFactory.openSession(); SQLQuery update = session.createSQLQuery(sql); Transaction tx=session.beginTransaction(); try{ if(null!=obj){ for(int i=0;i list,Class clazz) { boolean flag=false; Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { int i=0; for (Object t : list) { Object po=BeanConvertor.copyProperties(t, clazz); session.save(po); if ( i % 20 == 0 ) { //单次批量操作的数目为20 session.flush(); //清理缓存,执行批量插入20条记录的SQL insert语句 session.clear(); //清空缓存中 } i++; } tx.commit(); flag=true; session.close(); } catch (Exception e) { session.flush(); //清理缓存,执行批量插入20条记录的SQL insert语句 session.clear(); //清空缓存中 tx.rollback(); session.close(); e.printStackTrace(); } return flag; } /** *TODO *shisihai *20162016年2月24日下午4:09:22 *return null; **/ @Override public List queryBySqlExpand(String sql) { Session session =null; try { session = sessionFactory.openSession(); SQLQuery query=session.createSQLQuery(sql); return query.list(); } catch (HibernateException e) { e.printStackTrace(); log.error(message, e); return null; }finally { if(session!=null){ session.flush(); session.clear(); session.close(); } } } @Override public int updateBySqlParam(String sql, Object... params) { int count = 0; Session session = sessionFactory.openSession(); SQLQuery update = session.createSQLQuery(sql); Transaction tx=session.beginTransaction(); try{ bandParameter(update, params); count = update.executeUpdate(); tx.commit();//提交事务 }catch(Exception e){ tx.rollback();//回滚 }finally{ if(null!=session){ session.flush(); //清理缓存 session.clear(); //清空缓存中 session.close(); } } return count; } }