package com.gd.utils;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* 常用数据库持久化方法。
*
* @author chenqs
*
*/
public class BaseDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(BaseDAO.class);
/**
* 返回当前使用的Session
*
* @return Session
*/
public Session getCurrentSession() {
return this.getSession();
}
/**
* 将新增的记录持久化数据库
*
* @param transientInstance
*/
public void save(Object transientInstance) {
log.debug("saving Object instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
/**
* 将更改的记录持久化的数据库
*
* @param transientInstance
*/
public void update(Object transientInstance) {
log.debug("updating Object instance");
try {
getHibernateTemplate().update(transientInstance);
log.debug("update successful");
} catch (RuntimeException re) {
log.error("update failed", re);
throw re;
}
}
/**
* 将更改的或者新增的记录持久化到数据库
*
* @param transientInstance
*/
public void saveOrUpdate(Object transientInstance) {
log.debug("saveOrUpdate Object instance");
try {
getHibernateTemplate().saveOrUpdate(transientInstance);
log.debug("saveOrUpdate successful");
} catch (RuntimeException re) {
log.error("saveOrUpdate failed", re);
throw re;
}
}
/**
* 删除指定的记录。
*
* @param persistentInstance
*/
public void delete(Object persistentInstance) {
log.debug("deleting Object instance");
try {
getHibernateTemplate().delete(persistentInstance);
getHibernateTemplate().getSessionFactory().getCurrentSession().flush();
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
/**
* 根据hql语句和参数数组查询指定的表,未分页。
*
* @param hql
* @param args
* @return
*/
@SuppressWarnings("unchecked")
public List findByHql(String hql, Object[] args) {
log.debug("find custom hql.");
List result = null;
try {
if (args == null)
result = getHibernateTemplate().find(hql);
else
result = getHibernateTemplate().find(hql, args);
} catch (RuntimeException re) {
log.error("find failed", re);
throw re;
}
return result;
}
/**
* 根据原生sql语句和参数数组查询指定的表,未分页。
*
* @param sql
* @param args
* @return
*/
@SuppressWarnings("unchecked")
public List findBySql(String sql, Object[] args) {
log.debug("find custom hql.");
try {
Session session = this.getSession();
SQLQuery query = session.createSQLQuery(sql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof String)
query.setString(i, (String) args[i]);
else if (args[i] instanceof Integer)
query.setInteger(i, (Integer) args[i]);
else if (args[i] instanceof Date)
query.setDate(i, (Date) args[i]);
}
}
return query.list();
} catch (RuntimeException re) {
log.error("find failed", re);
throw re;
}
}
/**
* 根据更新hql语句和hql所需要参数更新数据库记录。
*
* @param hql
* @param args
* @return
*/
public boolean executeUpdateByHql(String hql, Object[] args) {
log.debug("execute custom hql.");
try {
getHibernateTemplate().bulkUpdate(hql, args);
return true;
} catch (RuntimeException re) {
log.error("find failed", re);
throw re;
}
}
/**
* 根据更新hql语句更新数据库记录。
*
* @param hql
*/
public int executeUpdateByHql(String hql) {
int rows = this.getSession().createSQLQuery(hql).executeUpdate();
return rows;
}
/**
* 批量更新和保存数据到数据库中
*
* @param entities
*/
@SuppressWarnings("unchecked")
public void batchSave(Collection entities) {
getHibernateTemplate().saveOrUpdateAll(entities);
}
/**
* 将集合中的记录批量删除。
*
* @param entities
*/
@SuppressWarnings("unchecked")
public void batchDel(Collection entities) {
getHibernateTemplate().deleteAll(entities);
getHibernateTemplate().getSessionFactory().getCurrentSession().flush();
}
/**
* 根据实体类和记录的主键值或者指定记录。
*
* @param entityClass
* @param id
* @return
*/
@SuppressWarnings("unchecked")
public Object getObjById(Class entityClass, Object id) {
Serializable sid = (Serializable) id;
return getHibernateTemplate().get(entityClass, sid);
}
/**
* 通过原生sql更新数据库表记录。
*
* @param sql
* @return
*/
@SuppressWarnings("deprecation")
public boolean updateForNativeSql(String sql) {
Connection conn = getCurrentSession().connection();
PreparedStatement ps;
boolean result = false;
try {
ps = conn.prepareStatement(sql);
result = ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* 查询前多少条记录,相当于SqlServer中的top topNum。
*
* @param hql
* @param pageSize
* @param pageNo
* @return
*/
@SuppressWarnings("unchecked")
public List findDataByTopNum(String hql, final int TopNum, Object[] args) {
Session session = this.getSession();
int temp = 0;
Query query = session.createQuery(hql);
for (int i = 0; args != null && i < args.length; i++) {
if (args[i] != null) {
query.setParameter(temp, args[i]);
temp++;
}
}
query.setFirstResult(0);
query.setMaxResults(TopNum);
List list = query.list();
return list;
}
/**
* 得到对象的主键名称
* @param clazz
* @return
*/
@SuppressWarnings("unchecked")
public String getPrimaryKeyName( Class clazz){
ClassMetadata meta = getSessionFactory().getClassMetadata(clazz);
if( meta==null)
return null;
return meta.getIdentifierPropertyName();
}
/**
* 保存并当时提交数据到数据库
*
* @param obj
*/
public void saveNoRoll(Object obj) {
log.debug("deleting Object instance");
getHibernateTemplate().getSessionFactory().getCurrentSession().evict(obj);
try {
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
tx.begin();
session.saveOrUpdate(obj);
session.flush();
tx.commit();
session.close();
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
}
- 1
- 2
前往页