package com.system.hibernate;
import java.util.Collection;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.hibernate.metadata.ClassMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.beans.factory.InitializingBean;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
@Repository("baseDao")
public class BaseDaoImpl implements InitializingBean{
private static final Logger logger = LoggerFactory.getLogger(BaseDaoImpl.class);
@Autowired
private SessionFactory sessionFactory;
@Autowired
private HibernateTemplate hibernateTemplate;
private final int BATCH_NUMBER = 100;//批量操作数
/**
* 模板缓存
*/
protected Map<String, StatementTemplate> templateCache;
@Autowired
protected DynamicHibernateStatementBuilder dynamicStatementBuilder;
// ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
private ThreadLocal<Session> session = null;
/**
* 创建session,需要手动关闭
* */
public Session openSession() {
return sessionFactory.openSession();
}
/**
* 根据sql插入或者更新
* */
public void insertOrUpdateBySql(String sql){
if(sql==null) return ;
try{
this.getCurrentSession().createSQLQuery(sql).executeUpdate();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 保存对象
* */
public boolean save(Object obj) {
if(obj==null) return false;
try {
this.hibernateTemplate.save(obj);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 保存所有对象
* */
public boolean saveAll(Collection col) {
if(col==null||col.size()==0) return false;
Session session = this.openSession();
Transaction tx = session.beginTransaction(); // 开启事物
int count = 0;
try {
Iterator iterator = col.iterator();
while(iterator.hasNext()){
count++;
session.save(iterator.next());
if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER个数据作为一个处理单元
session.flush(); //保持与数据库数据的同步
session.clear();//清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit(); // 提交事物
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
return false;
}
this.closeSession(session);
return true;
}
/**
* 删除对象
* */
public boolean delete(Object obj) {
try {
this.hibernateTemplate.delete(obj);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 按id删除对象.
*/
public boolean delete(Class clazz,Serializable id) {
try {
this.hibernateTemplate.delete( this.get(clazz, id) );
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 按id列表获取对象列表.
*/
public List get(Class clazz,Collection ids) {
if(clazz==null||ids==null||ids.size()==0) return null;
return find(clazz,Restrictions.in(getIdName(clazz), ids));
}
/**
* 按Criteria查询对象列表.
*
* @param criterions 数量可变的Criterion.
*/
@SuppressWarnings("unchecked")
public List find(Class clazz,final Criterion... criterions) {
return createCriteria(clazz,criterions).list();
}
/**
* 根据Criterion条件创建Criteria.
* 与find()函数可进行更加灵活的操作.
* @param criterions 数量可变的Criterion.
*/
public Criteria createCriteria(Class clazz,final Criterion... criterions) {
Criteria criteria = this.getCurrentSession().createCriteria(clazz);
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria;
}
/**
* 取得对象的主键名.
*/
public String getIdName(Class clazz) {
if(clazz==null) return null;
ClassMetadata meta = this.sessionFactory.getClassMetadata(clazz);
return meta.getIdentifierPropertyName();
}
/**
* 删除所有对象
* */
public boolean deleteAll(Collection col) {
if(col==null||col.size()==0) return false;
Session session = this.openSession();
Transaction tx = session.beginTransaction(); // 开启事物
int count = 0;
try {
Iterator iterator = col.iterator();
while(iterator.hasNext()){
count++;
session.delete(iterator.next());
if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER个数据作为一个处理单元
session.flush(); //保持与数据库数据的同步
session.clear();//清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit(); // 提交事物
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
return false;
}
this.closeSession(session);
return true;
}
/**
* 更新对象
* */
public boolean update(Object obj) {
if(obj==null) return false;
try {
this.hibernateTemplate.update(obj);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 更新所有对象
* */
public boolean updateAll(Collection col) {
if(col==null||col.size()==0) return false;
Session session = this.openSession();
Transaction tx = session.beginTransaction(); // 开启事物
int count = 0;
try {
Iterator iterator = col.iterator();
while(iterator.hasNext()){
count++;
session.update(iterator.next());
if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER个数据作为一个处理单元
session.flush(); //保持与数据库数据的同步
session.clear();//清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit(); // 提交事物
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
return false;
}
this.closeSession(session);
return true;
}
/**
* 保存或更新
* */
public boolean saveOrUpdate(Object obj) {
try {
this.hibernateTemplate.saveOrUpdate(obj);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 保存或更新所有实体
* */
public boolean saveOrUpdateAll(Collection col) {
Session session = this.openSession();
Transaction tx = session.beginTransaction(); // 开启事物
int count = 0;
try {
Iterator iterator = col.iterator();
while(iterator.hasNext()){
count++;
session.saveOrUpdate(iterator.next());
if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER个数据作为一个处理单元
session.flush(); //保持与数据库数据的同步
session.clear();//清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit(); // 提交事物
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
return false;
}
this.closeSession(session);
return true;
}
/**
* 得到Session ,spring自动管理session,不需要手动关闭
* */
public Session getCurrentSession() throws HibernateException {
// return this.hibernateTemplate.getSessionFactory().getCurrentSession();
return this.hibernateTemplate.getSessionFactory().openSession();
}
/**
* 根据原生sql语句进行查询,返回对象集合
* String sql 原生sql语句
* Class clazz 为类 String[] fields
* 必需为对象字段属性
* 例子: Sql : select username as name ,userage as age from