getQuery함수 구현 : 파라메터가 설정된 쿼리를 가져온다.(Map 및 Vo 를 Mapping한다)
/** * 쿼리를 받아온다. * @param sqlSession * @param queryId * @param sqlParam * @return * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException */ public String getQuery(String queryId , Object sqlParam) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { SqlSessionFactory sessionFactory = sqlSessionTemplate.getSqlSessionFactory(); Configuration configuration = sessionFactory.getConfiguration(); MappedStatement ms = configuration.getMappedStatement(queryId); BoundSql boundSql = ms.getBoundSql(sqlParam); String sql = boundSql.getSql(); ListparamMapping = boundSql.getParameterMappings(); for(ParameterMapping mapping : paramMapping){ String propValue = mapping.getProperty(); // 파라미터로 넘긴 Map의 key 값이 들어오게 된다 Class< ? > javaType = mapping.getJavaType(); String param = this.getValueFromParam(boundSql, propValue, javaType); sql = sql.replaceFirst("\\?", param); } sql = sql.replaceAll("\\n([\\s\\t]*)\\n", ""); //탭과 공백으로 이루어진 빈공간을 빼준다. return sql; } private String getValueFromParam(BoundSql boundSql, String propValue, Class< ? > javaType) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ String result = "''"; if(propValue.startsWith("__frch_")){ //배열입니다. Object param = boundSql.getAdditionalParameter(propValue); if(param != null){ // 파라미터가 아무것도 없을 경우 if(param instanceof String){ // 해당 파라미터의 클래스가 String 일 경우(이 경우는 앞뒤에 '(홑따옴표)를 붙인다. result = "'" + param + "'"; }else{ result = param.toString(); } } }else{ Object param = boundSql.getParameterObject(); if(param instanceof Integer || param instanceof Long || param instanceof Float || param instanceof Double){ result = param.toString(); }else if(param instanceof String){ // 해당 파라미터의 클래스가 String 일 경우(이 경우는 앞뒤에 '(홑따옴표)를 붙여야해서 별도 처리 result = "'" + param + "'"; }else if(param instanceof Map){ // 해당 파라미터가 Map 일 경우 Object value = ((Map) param).get(propValue); if(value != null){ if(value instanceof String){ result = "'"+((Map) param).get(propValue)+"'"; }else{ result = ""+((Map) param).get(propValue); } } }else{ // 해당 파라미터가 사용자 정의 클래스일 경우 vo Class< ? extends Object> paramClass = param.getClass(); Field field = paramClass.getDeclaredField(propValue); // 관련 멤버변수 Field 객체 얻어옴 field.setAccessible(true); // 멤버변수의 접근자가 private일 경우 reflection을 이용하여 값을 해당 멤버변수의 값을 가져오기 위해 별도로 셋팅 if(String.class == field.getType()){ result = "'" + field.get(param) + "'"; }else{ result = field.get(param).toString(); } } } return result; }