Guest User

Untitled

a guest
Sep 20th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. import java.lang.reflect.Method;
  2. import java.sql.ResultSet;
  3. import java.sql.ResultSetMetaData;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8.  
  9. /**
  10. * ResultSet 결과를 자동으로 Bean에 Set 하고 난 뒤에
  11. * ArrayList 형태로 반환받음
  12. */
  13.  
  14. public class BeanMapper implements RowMapper{
  15.  
  16. private Class beanClass = null;
  17.  
  18. private BeanMapper() {};
  19.  
  20. public BeanMapper(Class beanClass) {
  21.  
  22. if (beanClass == null) {
  23. new Exception (" 해당 클래스를 찾을 수가 없습니다.");
  24. }
  25.  
  26. this.beanClass = beanClass;
  27. }
  28.  
  29. public Object mapRow(ResultSet rs) throws SQLException {
  30.  
  31. Object obj = null;
  32.  
  33. List list = null;
  34.  
  35. try {
  36.  
  37. //컬럼정보를 가져옴
  38. ResultSetMetaData rsmd = rs.getMetaData();
  39.  
  40. //컬럼개수
  41. int count = rsmd.getColumnCount();
  42.  
  43. //Bean Class 의 instance를 생성함.
  44. obj = beanClass.newInstance();
  45.  
  46. //method들을 가져옴
  47. Method[] method = beanClass.getMethods();
  48.  
  49. HashMap methodMap = new HashMap();
  50.  
  51. //method들의 이름을 key값으로 하여 map 형태로 저장함
  52. for (int i = 0; i < method.length; i++) {
  53. methodMap.put(method[i].getName(), method[i]);
  54. }
  55.  
  56. //ResultSet 의 값을 Mapping 하기 위해..
  57. while (rs.next()){
  58.  
  59. //List 형태로 반환하기 위해..
  60. list = new ArrayList();
  61.  
  62. //컬럼 수 만큼 반복함
  63. for (int i = 1; i <= count; i++) {
  64.  
  65. //SQL 문에서 익명 값을 가져옴 ( 이유는 Mapping을 좀더 수월히 하기 위해서임 )
  66. String columnName = rsmd.getColumnLabel(i);
  67.  
  68. //setDocId 이런 형태로 만들기 위해서.. 즉 set+익명컬럼첫글자대문자+쭉...
  69. //카멜 명명법으로 컬럼명도 만들어야 쉽게 사용 가능하다.
  70. String setName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
  71.  
  72. try {
  73. // BeanClass의 메소드 명을 키값으로 만들었기 때문에 해당 클래스를 호출함.
  74. Method meth = (Method) methodMap.get(setName);
  75.  
  76. // method 존재여부
  77. if (meth == null) {
  78. System.out.println("해당 메소드가 없습니다. 확인해주세요 : " + setName);
  79. } else {
  80.  
  81. //method의 Type정보를 가져옴
  82. Class[] paramType = meth.getParameterTypes();
  83.  
  84. Object value = null;
  85.  
  86. //Type의 이름을 가져옴 ( ex-> java.util.Date => Date )
  87. //각 Type별로 rs.get? 해서 value에 담음..
  88. if (paramType[0].getSimpleName().equals("int")) {
  89. value = rs.getInt(i);
  90. } else if(paramType[0].getSimpleName().equals("Date")){
  91. value = rs.getDate(i);
  92. } else {
  93. value = rs.getString(i);
  94. }
  95.  
  96. //메소드 실행
  97. meth.invoke(obj, new Object[] { value });
  98.  
  99. }
  100. } catch (Exception e) {
  101. //어떤 컬럼에서 오류나는지 확인하기 위해 찍어봄..
  102. System.out.println(setName);
  103. e.printStackTrace();
  104. }
  105. }
  106.  
  107. //리스트에 담음
  108. list.add(obj);
  109. }
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. return list;
  114. }
  115.  
  116.  
  117. }
Add Comment
Please, Sign In to add comment