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와 맵핑
|