spring 集成hibernate 连接多数据库 java BaseDao 实现

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();
    }
    
}

         

转载于:https://my.oschina.net/xiaoshoubingliang/blog/740866

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值