본문 바로가기

IT

쿼리를 동적으로 조회하기

반응형

안녕하세요. 자바프로젝트 입니다.

불철주야  개발에  열심이신 개발자님 반갑습니다.

mybatis 경우  이미 만들어진  sql 을  조회합니다.

그러나  만약 사용자가 쿼리를 만들어서 파라메터로 받은 다음 조회  할 경우는 어떻게 할까요?

즉 동적으로  sql 를 실행하는 경우 입니다.

몇가지 방법이 있습니다.

그 중에 하나입니다.

 

    /**
	 * 
	 * @param query  (sql 쿼리가 들어감)
	 * @return 쿼리 쿼리 결과가 리턴함( KEY :	columnList ,dataList )
	 *  (columnList -> 컬럼 리스트, dataList - > 데이터)
	 */
    public Map<String, Object> getQueryResultData(String query) {
		Map<String,Object> queryResultData = new HashMap<String,Object>(); 

		List<String>  columnList = new ArrayList<String>(); 
				
		List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); 
		
    	String JDBC = "com.mysql.jdbc.Driver";
    	String URL = "jdbc:mysql://localhost:3306/javaproject";
    	String ID = "javaprojject";
    	String PWD = "1234";
    	String SQL = query.replaceAll(";","");
    	Connection conn = null;
    	PreparedStatement psmt = null;
    	ResultSet rs = null;
		try {
			Class.forName(JDBC);			
			
			conn = DriverManager.getConnection(URL, ID, PWD);
			psmt = conn.prepareStatement(SQL);			
			rs = psmt.executeQuery();
			ResultSetMetaData meta = rs.getMetaData();			
			int colCnt = meta.getColumnCount();
		
			for(int i = 1;i<=colCnt;i++) {
				String name = meta.getColumnName(i);
				columnList.add(name);
			}		
			while(rs.next()) {
				Map<String,Object> cont = new HashMap<String,Object>();
				for(int i = 1;i<=colCnt;i++) {
					String name = meta.getColumnName(i);
					Object value = rs.getObject(i);
					
					if(value == null)value = "";
					if(value instanceof String) {						
						value = ((String)value).replace("\\", "\\\\")
						               .replace("\'", "\\\'")
						               .replace("\"", "\\\"")
						               .replace("\r\n", "\\n")
						               .replace("\n", "\\n");
						               
						               
					} else if(value instanceof java.sql.Clob) {
					
						 StringBuffer output = new StringBuffer();
						 String str = "";
						 Clob clob = (java.sql.Clob)value;
						 BufferedReader br = new BufferedReader(clob.getCharacterStream());
						 try {
							 while((str = br.readLine())!=null) {
							 output.append(str);
						 }
						 }catch(Exception e) {}
						     value = output.toString();
						     value = ((String)value).replace("\\", "\\\\")
								               .replace("\'", "\\\'")
								               .replace("\"", "\\\"")
								               .replace("\r\n", "\\n")
								               .replace("\n", "\\n");
					}
						
					cont.put(name, value);
				}				
				dataList.add(cont);
			}
			
			queryResultData.put("columnList", columnList);
			queryResultData.put("dataList", dataList);
			
		} catch (ClassNotFoundException e) {
			System.out.println("jdbc driver 로딩 실패");
		} catch (SQLException e) {
			System.out.println(" 연결 실패" + e.getMessage());
		}finally {
			if (rs!=null) {
				   try {
				      rs.close();
				   } catch (SQLException e) {
				   }
				}
				 
				if(psmt!=null) {
				   try {
					   psmt.close();
				   } catch (SQLException e) {
				   }
				}
				 
				if(conn!=null) {
				   try {
				      conn.close();
				   } catch (SQLException e) {
				   }
				}
		}

		return queryResultData;
		
	}

 

혹시 궁금한점이나 더 알고 싶은 부분이 있으면 편하게 답글 남겨주시면  답변드리겠습니다.

감사합니다.

반응형