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