HetaJs

MyBatis getQuery

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