Spring 호출 저장 프로시저 반환 결과 집합

4809 단어 spring
Spring 의 JdbcTemplate 는 저장 프로 세 스 호출 에 대한 지원 을 충분히 제공 합 니 다.
그러나 결과 집합, sqlServer (ResultSet), Oracle (커서) 을 직접 구성 하 는 방식
많은 경우 에 우 리 는 이 정 보 를 List < Map > 으로 봉 하거나 List < Bean > 의 형식 으로 응용 층 에 되 돌려 주어 야 한다.
구현 방식:

@Override
public List<Map<String, Object>> callProcedure(String spName,Object[] paramValues) throws SQLException {
		List<Map<String, Object>> rows = null;
		CommonStoredProcedure sp = new CommonStoredProcedure(this.getJdbcTemplate(),spName);
		rows = sp.queryList(Arrays.asList(paramValues));
		return rows==null?new ArrayList(0):rows;
	}

CommonStoredProcedure
Stored Procedure 추상 클래스 계승

public List queryList(List inParams){
		List result = null;
		Map<String,Object> paramMap = 
new HashMap<String,Object>();
		for(int i=0;i<inParams.size();i++){
    		Object paramValue = inParams.get(i);
//               		
String paramName = "In_"+String.valueOf(i);
    		int paramType = getSqlType(paramValue);
    		setParameter(paramName,paramType);   		paramMap.put(paramName, paramValue);
    	}
		setInParam(paramMap);
//       		
declareParameter(new SqlReturnResultSet("Out",rowMapper));
		Map<String,Object> map = execute();
		result = (List)map.get("Out");
    	return result == null?new ArrayList(0):result;
	}



위의 코드 는 DB2 와 SQLSERVER 에 모두 사용 할 수 있 지만,
Oacle 은 좀 달라 요.
그 는 SqlOutParameter 를 사용 해 야 한다 고 설정 했다.
인용 하 다.
Oracle 의 버 전 은 매우 비슷 하 다. 다만 Oracle 은 정규 출력 매개 변 수 를 사용 하여 결과 집합 을 전송 할 뿐이다.이 매개 변 수 는 Oracle. jdbc. Oracle Types. CURSOR 형식 전에 설명 해 야 하 며, Row Mapper 를 세 번 째 매개 변수 로 전송 해 야 합 니 다.이것 은 정규 SqlOutParameter 출력 매개 변수 이기 때문에 다른 유형의 출력 매개 변수 와 같은 순서 로 설명 해 야 합 니 다.

declareParameter(new SqlOutParameter("genre", oracle.jdbc.OracleTypes.CURSOR, new MapGenre()));
    

전체 코드

public class CommonStoredProcedure extends StoredProcedure {
	
	private Map<String,?> inParam;
	private RowMapper rowMapper = new ColumnMapRowMapper();
	
	public CommonStoredProcedure(DataSource ds, String spName){
		super(ds,spName);
	}
	public CommonStoredProcedure(JdbcTemplate jdbcTemplate, String name) {
		super(jdbcTemplate,name);
	}
	
	public void setMapperBean(Class mappedClass){
		rowMapper = new HeipBeanPropertyRowMapper(mappedClass);
	}
	
	public List queryList(List inParams){
		List result = null;
		Map<String,Object> paramMap = 
new HashMap<String,Object>();
		for(int i=0;i<inParams.size();i++){
    		Object paramValue = inParams.get(i);
    		String paramName = "In_"+String.valueOf(i);
    		int paramType = getSqlType(paramValue);
    		setParameter(paramName,paramType);   		paramMap.put(paramName, paramValue);
    	}
		setInParam(paramMap);
		declareParameter(new SqlReturnResultSet("Out",rowMapper));
		Map<String,Object> map = execute();
		result = (List)map.get("Out");
    	return result == null?new ArrayList(0):result;
	}
	
	
	public Map<String,Object> execute(){
		compile();
		return execute(inParam);
	}
	public void setInParam(Map<String,?> inParam){
		this.inParam = inParam;
	}
	public void setOutParameter(String column,int type,RowMapper rowMapper){
		declareParameter(new SqlOutParameter(column,type,rowMapper));
	}
	public void setParameter(String column,int type){
		declareParameter(new SqlParameter(column,type));
	}
	public void setParameters(String[] columns, int[] types) {
		for (int i = 0; i < columns.length; i++) {
			setParameter(columns[i],types[i]);
		}
	}
	
	private static int getSqlType(Object obj){
		if (obj instanceof String) {
			return Types.VARCHAR;
		}
		if (obj instanceof Long
		    	||obj instanceof BigDecimal
		    	||obj instanceof Double
		    	||obj instanceof Integer) {
			return Types.NUMERIC;
		}
		if (obj instanceof Date) {
			return Types.DATE;
		}
		/*if (obj instanceof Boolean) {
			return Types.NUMERIC;
		}*/
		
		return Types.OTHER;
	 }
}

발췌:
Spring DAO 의 저장 과정의 고급 용법
http://westzq.blog.hexun.com/6353026_d.html
Spring DAO 의 저장 과정의 고급 용법
http://blog.163.com/z278440337@126/blog/static/186995032008420102635244/

좋은 웹페이지 즐겨찾기