spring로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

spring로 검색한 결과
등록일:2008-06-11 11:25:21
작성자:
제목:getJdbcTemplate에서 VO클래스와 ResultSet 자동 맵핑


import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import org.springframework.jdbc.core.RowMapper;

public class BeanRowMapper implements RowMapper {

 private Class targetClass = null;
 private BeanRowMapper() {};
 public BeanRowMapper(Class targetClass) {
  if (targetClass == null)
  new RuntimeException("targetClass can't be null");
  this.targetClass = targetClass;
 }

 public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
  Object o = null;

  try {
   ResultSetMetaData rsmd = rs.getMetaData();
   int columnCnt = rsmd.getColumnCount();
   o = targetClass.newInstance();
   Method[] method = targetClass.getMethods();
   HashMap methMap = new HashMap();
   
   for (int i = 0 ; i < method.length ; i++) {
    methMap.put(method[i].getName(), method[i]);
   }
   
   for (int i = 1 ; i <= columnCnt ; i++) {
    String columnName = rsmd.getColumnName(i);
    columnName = columnName.toLowerCase();
    while(columnName.indexOf("_")>-1){
     columnName = convertString(columnName);
    }
    String setterName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
    try {
     Method meth = (Method) methMap.get(setterName);
     if (meth == null) {
      System.out.println("Method Invocation Error : " + setterName);
     }else{
      String rsVal = rs.getString(i);
      Class[] paramType = meth.getParameterTypes();
      Object value = null;
      if(paramType[0].equals(Integer.TYPE)){//파라메터 타입이 Integer라면
       value = new Integer(rs.getString(i));
      }else if(paramType[0].equals(Float.TYPE)){//파라메터 타입이 Float라면
       value = new Float(rs.getString(i));
      }else{
       value = rs.getString(i);
      }
      if(rsVal==null)rsVal = "";
      meth.invoke(o, new Object[] {value});
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
  catch (Exception e) {
   e.printStackTrace();
  }
  return o;
 }
 private String convertString(String str) throws Exception{
  String tempStr = null;
  if(str.indexOf("_")>-1){
   int index = str.indexOf("_");
   if(index!=str.length()-1){
    tempStr = str.substring(0,index)+str.substring(index+1,index+2).toUpperCase()+str.substring(index+2);
   }else{
    tempStr = str.substring(0,index);
   }
  }else{
   tempStr = str;
  }
  return tempStr;
 }
}

 

 

자바지기의 성시원님 소스에 현재 사용중인 Naming 메소드를 결합하고 몇가지 수정하여 쓰고

있는 클래스!!

기존 콜백 메소드로 인해 inner Calss들이 많이 생성되는 점을 보완하는 좋은 소스인 것 같습니다.

몇가지 성능에 대한 부담이 있기는 하지만....

차차 문제점은 개선해 나가야 겠죠...

 

사용하시려면... getJdbcTemplate().query(query, Object[], new BeanRowMapper(VO.class));

예) REQ_NO 컬럼을 setReqNo메소드와 맵핑

     혹은 SERVE_EMP_NO는 setServeEmpNo와 맵핑