spring多数据源3


@Repository
public abstract class DaoTemplate{
	
	protected abstract Session getSession(); 
	private  String type ;
	
    public String getType() {
		return type;
	}

	protected  void setType(String type){
	     this.type = type ;	
	};

	private void sqlQueryInit(SQLQuery sqlQuery , SQLParam sp){
    	String sql = sp.getSql().toString() ;
    	String[] para = sql.replace("," , "").split(" ") ;
		String father = "" ;
		List<String> columes = new ArrayList<String>() ;
		for(String s : para){
			if(s == null || s.trim().equals("")) continue ;
			s = s.trim() ;
			if(s.equals("as")){
				father = "as" ;
			}
			else if(father.equals("as")){
			    columes.add(s) ;
			    father = s ;
			}
		}
    	for(String colume : columes) {
    		sqlQuery.addScalar(colume , StandardBasicTypes.STRING) ;
		}
    	countQueryInit(sqlQuery , sp) ; 
    }
    
    private void countQueryInit(SQLQuery sqlQuery , SQLParam sp){
		for(Map.Entry<String , String> e : sp.getSetStrings().entrySet()){
			sqlQuery.setString(e.getKey() , e.getValue()) ;			
		}
		for(Map.Entry<String , Date> e : sp.getSetDates().entrySet()){
			sqlQuery.setDate(e.getKey() , e.getValue()) ;
		}
		for(Map.Entry<String , Date> e : sp.getSetTimestamps().entrySet()){
			sqlQuery.setTimestamp(e.getKey() , e.getValue()) ;
		}
		for(Map.Entry<String, Long> e : sp.getSetlongs().entrySet()){
			sqlQuery.setLong(e.getKey() , e.getValue()) ;
		}
		for(Map.Entry<String, Integer> e : sp.getSetIntegers().entrySet()){
			sqlQuery.setInteger(e.getKey() , e.getValue()) ;
		}
    }
	
	public  DataWrapper<List<Map<String , String>>> getBySQLParam(SQLParam sp){
	
		DataWrapper<List<Map<String , String>>> retDw = new DataWrapper<List<Map<String , String>>>() ;
		
		Session session = getSession() ;
		SQLQuery query = session.createSQLQuery( sp.getQuerySql()  ) ;
		sqlQueryInit(query, sp) ;
			
		if(sp.getNumberPerPage() > 0 && sp.getPageNumber() > 0){
				query.setMaxResults(sp.getNumberPerPage())  ;
				query.setFirstResult((sp.getPageNumber() - 1) * sp.getNumberPerPage()) ;
				@SuppressWarnings("unchecked")
				List<Map<String , String>> data  =  query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list() ;
				if(data.size()==0||data==null){
					data = new ArrayList<Map<String , String>>();
				}
				retDw.setData(data) ;
				
				SQLQuery countQuery = session.createSQLQuery( sp.getCountSql()  ) ;
				countQueryInit(countQuery, sp) ;
				int totalItemNum = 0;
				if("pg".equals(getType())){
					totalItemNum = ((java.math.BigInteger)countQuery.list().get(0)).intValue() ;
				}else if("oracle".equals(getType())){
					totalItemNum = ((java.math.BigDecimal)countQuery.list().get(0)).intValue() ;
				}
				int totalPageNum = DaoUtils.getTotalPageNumber(totalItemNum, sp.getNumberPerPage() ) ;
				retDw.setTotalNumber(totalItemNum) ;
				retDw.setTotalPage(totalPageNum) ;
				retDw.setCurrentPage(sp.getPageNumber()) ;
				retDw.setNumberPerPage(sp.getNumberPerPage())  ;
		}	
		else{
			@SuppressWarnings("unchecked")
			List<Map<String , String>> data  =  query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list() ;
			if(data.size()==0||data==null){
				data = new ArrayList<Map<String , String>>();
			}
			retDw.setData(data) ;
		}
	
		return retDw ;
	}
	
	
	public Integer getCountBySQLParam(SQLParam sp){
		Session session = getSession() ;
		SQLQuery countQuery = session.createSQLQuery( sp.getCountSql() ) ; 
		countQueryInit(countQuery, sp) ;
		return ((java.math.BigInteger)countQuery.list().get(0)).intValue()  ;
	}
 
    public void save(Object entity) {
        Session session = getSession();
        try{
            session.beginTransaction();
            session.save(entity);
            session.getTransaction().commit();
            session.flush();
        }catch(Exception e){
            session.getTransaction().rollback();
        }
    }




    public void delete(Object entity) {
        Session session = getSession();
        try{
            session.beginTransaction();
            session.delete(entity);
            session.getTransaction().commit();
            session.flush();
        }catch(Exception e){
            session.getTransaction().rollback();
        }
    }
}






@Service
public class OracleDao extends DaoTemplate{
	
	@Autowired
    @Resource(name="oracleSessionFactory")
    protected SessionFactory sessionFactory;
	
	protected  Session getSession() {
	    return sessionFactory.getCurrentSession();
    }

	@PostConstruct
	void init(){
		super.setType("oracle") ;
	}
	
}


@Service
public class PgDao extends DaoTemplate{
	
	@Autowired
    @Resource(name="pgSessionFactory")
    protected SessionFactory sessionFactory;
	
	protected  Session getSession() {
	    return sessionFactory.getCurrentSession();
    }
	
	@PostConstruct
	void init(){
		super.setType("pg") ;
	}
	
}



public class SQLParam{
	  
    private List<String> addScalars ;
    private Map<String , String> setStrings ;
	private Map<String , Date> setDates ;
	private Map<String , Long> setLongs ;
	private Map<String , Integer> setIntegers ;
	private Map<String , Date> setTimestamps ;
	
	private StringBuffer sql ;
	private StringBuffer condition ;
	private StringBuffer orderBy ;
	private Integer numberPerPage ;
	private Integer pageNumber ; 
	private String toCountTable ;
  
    public SQLParam() {
	      addScalars = new ArrayList<String>() ;
	      setStrings = new HashMap<String , String>() ;
	      setDates = new HashMap<String , Date>() ;
	      setLongs = new HashMap<String , Long>() ;
	      setIntegers = new HashMap<String , Integer>() ;
	      setTimestamps = new HashMap<String , Date>() ;
	      sql = null ;
	      condition = null ;
	      orderBy = null ;
	      toCountTable = null ; 
	      numberPerPage = -1 ;
	      pageNumber = -1 ; 
    }
  
    public void addScalar(String... keys){
    	 for(String key : keys)
	         addScalars.add(key) ;
    }
  
    public void setString(String key , String value){
	     setStrings.put(key, value) ;
    }
    
    public void setLong(String key , Long value){
    	setLongs.put(key, value) ;
    }
  
    public void setDate(String key , Date value){
	    setDates.put(key, value) ;
    }
    
    public void setInteger(String key , Integer value){
    	setIntegers.put(key, value) ;
    }
    
    public void setTimestamp(String key , Date value){
    	setTimestamps.put(key, value) ;
    }
    
	public Map<String, Date> getSetTimestamps() {
		return setTimestamps;
	}


	public List<String> getAddScalars() {
 	     return addScalars;
    }

    public Map<String, String> getSetStrings() {
  	    return setStrings;
    }
    
    public Map<String, Long> getSetlongs() {
  	    return setLongs  ;
    }
    
    public Map<String, Integer> getSetIntegers() {
  	    return setIntegers   ;
    }

    public Map<String, Date> getSetDates() {
	   return setDates;
    }

	public void setSql(StringBuffer sql) {
		this.sql = sql;
	}
	
	public StringBuffer getSql() {
		return  sql;
	}

	public void setCondition(StringBuffer condition) {
		this.condition = condition;
	}

	public void setOrderBy(StringBuffer orderBy) {
		this.orderBy = orderBy;
	}

	public Integer getNumberPerPage() {
		return numberPerPage;
	}

	public void setNumberPerPage(Integer numberPerPage) {
		this.numberPerPage = numberPerPage;
	}

	public Integer getPageNumber() {
		return pageNumber;
	}

	public void setPageNumber(Integer pageNumber) {
		this.pageNumber = pageNumber;
	}
	
	
	public String getToCountTable() {
		return toCountTable;
	}

	public void setToCountTable(String toCountTable) {
		this.toCountTable = toCountTable;
	}

	public String getQuerySql(){
		return new StringBuffer( sql ).append( condition ).append( orderBy == null ? "" : orderBy ).toString() ;
	}
	
	public String getCountSql(){
		if(toCountTable == null)
		     return new StringBuffer( "select count(1)  " ).append( condition ).toString() ;
		else 
		     return new StringBuffer( "select count(" + toCountTable + ")  " ).append( condition ).toString() ;
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值