package com.htjf.dao.impl;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import com.htjf.common.PropertiesUtils;
import com.htjf.dao.BaseDao;
import com.htjf.entity.OrgEntity;
import com.htjf.exception.BaseException;
import com.htjf.model.Page;
@SuppressWarnings({ "rawtypes", "unchecked" })
@Repository("BaseDao")
public class BaseDaoImpl<T extends Serializable> implements BaseDao<T> {
@Autowired
private BaseHibernateTemplates baseHibernateTemplates;
private Class<T> entityClass;
public BaseDaoImpl() {
Class c = getClass();
System.out.println("c"+c);
Type type = c.getGenericSuperclass();
System.out.println("type"+type);
if (type instanceof ParameterizedType) {
System.out.println(1);
Type[] p = ((ParameterizedType) type).getActualTypeArguments();
this.entityClass = (Class<T>) p[0];
}
}
public Class<T> getEntityClass() {
return entityClass;
}
public void setEntityClass(Class<T> entityClass) {
this.entityClass = entityClass;
}
public HibernateTemplate loadUsehibernateTemplate(String type) {
if(type==null||"".equals(type)){
type = "speech";
}
if(baseHibernateTemplates==null||baseHibernateTemplates.getHibernateTemplateMap()==null||baseHibernateTemplates.getHibernateTemplateMap().get(type)==null){
return null;
}
return baseHibernateTemplates.getHibernateTemplateMap().get(type);
}
@Override
public T get(Serializable id, String type) {
return (T) (loadUsehibernateTemplate(type)).get(entityClass, id);
}
@Override
public Serializable save(T entity, String type){
return (loadUsehibernateTemplate(type)).save(entity);
}
@Override
public void save(final List<T> entityList, String type) {
(loadUsehibernateTemplate(type)).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
int count = 0;
for (T entity : entityList) {
session.save(entity);
if (++count % 10 == 0) {
session.flush();
session.clear();
}
}
return null;
}
});
}
@Override
public void update(T entity, String type) {
(loadUsehibernateTemplate(type)).update(entity);
}
@Override
public void update(final List<T> entityList, String type) {
(loadUsehibernateTemplate(type)).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
int count = 0;
for (T entity : entityList) {
session.update(entity);
if (++count % 10 == 0) {
session.flush();
session.clear();
}
}
return null;
}
});
}
@Override
public void remove(T entity, String type) {
(loadUsehibernateTemplate(type)).delete(entity);
}
@Override
public void remove(List<T> entityList, String type) {
(loadUsehibernateTemplate(type)).deleteAll(entityList);
}
@Override
public List<T> find(String queryString,String type, Object... values) {
System.out.println(queryString);
System.out.println(type);
System.out.println(values);
return (loadUsehibernateTemplate(type)).find(queryString, values);
}
@Override
public List<T> find(final String queryString, final Page page,String type, final Object... values){
int beginIndex = queryString.toLowerCase().indexOf("from");
String countQueryString = "select count(*) "
+ queryString.substring(beginIndex);
int totalCount = ((Long) (loadUsehibernateTemplate(type)).find(countQueryString,
values).get(0)).intValue();
if (totalCount < 1)
return null;
page.setTotalCount(totalCount);
List<T> list = (loadUsehibernateTemplate(type)).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(queryString);
for (int i = 0; i < values.length; i++)
query.setParameter(i, values[i]);
return (List<T>) query.setFirstResult(page.getStartOfPage())
.setMaxResults(page.getPageSize()).list();
}
});
return list;
}
public List<T> findAll(String type) {
String queryString = "from " + entityClass.getSimpleName();
return find(queryString,type);
}
public List<T> findAll(Page page,String type) {
String queryString = "from " + entityClass.getSimpleName();
return find(queryString, page,type);
}
@Override
public List<Object[]> findBySQL(final String queryString,String type,
final Object... values) {
(loadUsehibernateTemplate(type)).setCacheQueries(false);
// 当使用原始SQL查询时,应当关闭二级缓存,否则会报数组越界错误。
List<Object[]> list = (loadUsehibernateTemplate(type))
.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createSQLQuery(queryString);
for (int i = 0; i < values.length; i++)
query.setParameter(i, values[i]);
return query.list();
}
});
return list;
}
@Override
public void excuteUpdate(final String queryString,String type,final Object... values) {
(loadUsehibernateTemplate(type)).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(queryString);
for (int i = 0; i < values.length; i++)
query.setParameter(i, values[i]);
return query.executeUpdate();
}
});
}
private Query handingQuery(Query query,List<Object> objList,Map<String,String> sqlMap,int start,int limit){
if (objList != null) {
for (int i = 0; i < objList.size(); i++) {
query.setParameter(i, objList.get(i));
}
}
if (start >= 0) {
query.setFirstResult(start);
query.setMaxResults(limit);
}
if(sqlMap != null && !sqlMap.isEmpty()){
Set keySet = sqlMap.keySet();
if(keySet != null && !keySet.isEmpty()){
Iterator itor = keySet.iterator();
while(itor.hasNext()){
String key = (String)itor.next();
query.setString(key, (String)sqlMap.get(key));
}
}
}
query.setCacheable(false);
return query;
}
@Override
public String findCountByHql( final String hsql, final List<Object> objList,final Map<String,String> sqlMap, String type) throws Exception{
String sum = "0";
List list = loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createQuery(hsql);
query= handingQuery(query,objList,sqlMap,-1,0);
List list = query.list();
return list;
}
});
if (list != null) {
// 返回数据个数
if (list.get(0) instanceof Object[]) {
Object[] objArray = (Object[]) list.get(0);
for (int i = 0; i < objArray.length; i++) {
sum = String.valueOf(objArray[i]);
}
} else {
sum = String.valueOf(list.get(0));
}
}
return sum;
}
@Override
public List<T> findListByHql( final String hsql, final List<Object> objList,final Map<String,String> sqlMap, final int start, final int limit,String type) throws Exception{
return loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createQuery(hsql);
query= handingQuery(query,objList,sqlMap,start,limit);
List list = query.list();
return list;
}
});
}
@Override
public String findCountBySql(final String sql, final List<Object> objList,final Map<String,String> sqlMap, String type) throws Exception{
String sum = "0";
List list = loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createSQLQuery(sql);// .addEntity(Integer.class)
query= handingQuery(query,objList,sqlMap,-1,0);
List list = query.list();
return list;
}
});
if (list != null) {
// 返回数据个数
if (list.get(0) instanceof Object[]) {
Object[] objArray = (Object[]) list.get(0);
for (int i = 0; i < objArray.length; i++) {
sum = String.valueOf(objArray[i]);
}
} else {
sum = String.valueOf(list.get(0));
}
}
return sum;
}
@Override
public List<Object[]> findListArrayBySql(final String sql, final List<Object> objList,final Map<String,String> sqlMap,final int start, final int limit,String type) throws Exception{
return loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createSQLQuery(sql);
query= handingQuery(query,objList,sqlMap,start,limit);
List list = query.list();
return list;
}
});
}
@Override
public List<T> findListBySql(final String sql, final List<Object> objList,final Map<String,String> sqlMap,final int start, final int limit,String type) throws Exception{
return loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createSQLQuery(sql).addEntity(entityClass);
query= handingQuery(query,objList,sqlMap,start,limit);
List<T> list = query.list();
return list;
}
});
}
public List<T> findListTransformeBySql(final String sql,final List<Object> objList,final Map<String,String> sqlMap,final int start, final int limit,String type) throws Exception{
return loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = s.createSQLQuery(sql);
query= handingQuery(query,objList,sqlMap,start,limit);
query.setResultTransformer(Transformers.aliasToBean(entityClass));
List<T> list = query.list();
return list;
}
});
}
/**
* 执行DDL SQL语句
*
* @param sql
* sql语句字符串
* @throws Exception
*/
@Override
public void ddlSQLTable(final String sql, final List<Object> objList,String type) throws Exception{
loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
SQLQuery query = s.createSQLQuery(sql);
if (objList != null) {
for (int i = 0; i < objList.size(); i++) {
query.setParameter(i, objList.get(i));
}
}
query.executeUpdate();
return null;
}
});
}
/**
* 执行UPdate SQL语句
*
* @param sql
* sql语句字符串
* @throws Exception
*/
@Override
public void executeUpdateSql(final String sql, String type,final Object... values) throws Exception{
loadUsehibernateTemplate(type).execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
SQLQuery query = s.createSQLQuery(sql);
for (int i = 0; i < values.length; i++)
query.setParameter(i, values[i]);
return query.executeUpdate();
}
});
}
/**
* 按照条件和值查询实体
*
* @param entityName
* 查询对象
* @param propertyName
* 属性条件
* @param propertyValue
* 值
* @return List 查询结果
* @throws BaseException
*/
@Override
public List<T> findByProperty(String propertyName, Object propertyValue,String type) throws Exception{
String hql = "from " + entityClass.getName() + " where " + propertyName+ " = ?";
List<T> list = null;
List parasList = new ArrayList();
parasList.add(propertyValue);
list = (List<T>) findListByHql(hql, parasList,null, -1, 0,type);
return list;
}
}
package com.htjf.dao.impl;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.htjf.dao.CodeDao;
import com.htjf.dao.impl.BaseDaoImpl;
import com.htjf.entity.CodeEntity;
import com.htjf.exception.BaseException;
import org.springframework.stereotype.Repository;
@Repository("codeDao")
public class CodeDaoImpl extends BaseDaoImpl<CodeEntity> implements CodeDao {
private static Logger log = Logger.getLogger(CodeDaoImpl.class);
@Override
public List<CodeEntity> queryCodeList(Map<String,Object> map,int start,int limit) throws BaseException{
List<CodeEntity> codeList = null;
try {
codeList = findListBySql(getSqlStr(map,"list"), null, null, start,limit, null);
} catch (Exception e) {
log.error(e, e);
throw new BaseException("PF00009",new String[]{"参数"});
}
return codeList;
}
@Override
public String queryCodeNum(Map<String,Object> map) throws BaseException{
String recordTotal = "";
try {
recordTotal = findCountBySql(getSqlStr(map,"num"), null, null, null);
} catch (Exception e) {
log.error(e, e);
throw new BaseException("PF00010",new String[]{"参数"});
}
return recordTotal;
}
@Override
public List<CodeEntity> queryCodeListByField(String fieldName,String fieldValue){
String queryString="from CodeEntity where "+fieldName+"=? order by codeOrder";
List<CodeEntity> reporCodeList = super.find(queryString,"", fieldValue);
return reporCodeList;
}
/**
* 拼sql语句---建议使用大写字符拼写sql
* @param map 查询参数
* @param queryType : list 数据对象 num 数据对象个数
* @param valueType :0或null 模糊查询
* @return
*/
private String getSqlStr(Map<String, Object> map,String queryType){
StringBuilder sbSql = new StringBuilder("");
if("list".equals(queryType)){
sbSql.append("select t.* from t_code t where 1=1 ");
}else if("num".equals(queryType)){
sbSql.append("select count(t.id) from t_code t where 1=1 ");
}
boolean isCodeType = (map.get("codeType")!=null)&&!("".equals(map.get("codeType")));
if(isCodeType){
if("1".equals(map.get("valueType"))){//valueType :0或null 模糊查询
sbSql.append(" and t.CODE_TYPE = '").append(map.get("codeType")).append("'");
}else{
sbSql.append(" and t.CODE_TYPE like '%").append(map.get("codeType")).append("%'");
}
}
if((map.get("codeValue")!=null)&&!("".equals(map.get("codeValue")))){
if("1".equals(map.get("valueType"))){//valueType :0或null 模糊查询
sbSql.append(" and t.CODE_VALUE = '").append(map.get("codeValue")).append("'");
}else{
sbSql.append(" and t.CODE_VALUE like '%").append(map.get("codeValue")).append("%'");
}
}
if((map.get("codeNameEn")!=null)&&!("".equals(map.get("codeNameEn")))){
if("1".equals(map.get("valueType"))){//valueType :0或null 模糊查询
sbSql.append(" and t.CODE_NAME_EN = '").append(map.get("codeNameEn")).append("'");
}else{
sbSql.append(" and t.CODE_NAME_EN like '%").append(map.get("codeNameEn")).append("%'");
}
}
if((map.get("codeNameCn")!=null)&&!("".equals(map.get("codeNameCn")))){
if("1".equals(map.get("valueType"))){//valueType :0或null 模糊查询
sbSql.append(" and t.CODE_NAME_CN = '").append(map.get("codeNameCn")).append("'");
}else{
sbSql.append(" and t.CODE_NAME_CN like '%").append(map.get("codeNameCn")).append("%'");
}
}
if("list".equals(queryType)){
sbSql.append(" order by t.CODE_NAME_EN, t.CODE_ORDER ");
}
return sbSql.toString();
}
}