1. 程式人生 > >將jdbc結果集ResultSet轉換成物件列表

將jdbc結果集ResultSet轉換成物件列表

將jdbc結果集轉換成物件列表 
估計hibernate就是用得這種方式進行轉換的。 
實體物件 

點選(此處)摺疊或開啟

  1. package test;
  2. //實體物件,該物件的屬性與資料庫中的欄位相同,當然可以改變具體看需求
  3. public class Person {
  4.     private int id;
  5.     private int age;
  6.     private String name;
  7.     public int getId() {
  8.         return id;
  9.     }
  10.     public void setId(int id) {
  11.         this.id =
     id;
  12.     }
  13.     public int getAge() {
  14.         return age;
  15.     }
  16.     public void setAge(int age) {
  17.         this.age = age;
  18.     }
  19.     public String getName() {
  20.         return name;
  21.     }
  22.     public void setName(String name) {
  23.         this.name = name;
  24.     }
  25. }

點選(此處)摺疊或開啟

  1. package test;
  2. import java
    .lang.reflect.Field;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.List;
  8. public class Main {
  9.     //用於測試的方法
  10.     public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException
    , ClassNotFoundException {
  11.         Connection conn = DbUtils.getConn();
  12.         ResultSet rs = null;
  13.         PreparedStatement psmt = null;
  14.         System.out.println(conn);
  15.         try {
  16.             psmt = conn.prepareStatement("select * from person");
  17.             rs = psmt.executeQuery();
  18.             List list = DbUtils.populate(rs, Person.class);
  19.             for(int i = 0 ; i<list.size() ; i++){
  20.                 Person per = (Person) list.get(i);
  21.                 System.out.println("person : id = "+per.getId()+" name = "+per.getName()+" age = "+per.getAge());
  22.             }
  23.         } catch (SQLException e) {
  24.             e.printStackTrace();
  25.         }finally{
  26.             if(rs!=null){
  27.                 try {
  28.                     rs.close();
  29.                 } catch (SQLException e) {
  30.                     e.printStackTrace();
  31.                 }
  32.                 rs=null;
  33.             }
  34.             if(psmt!=null){
  35.                 try {
  36.                     psmt.close();
  37.                 } catch (SQLException e) {
  38.                     e.printStackTrace();
  39.                 }
  40.                 psmt=null;
  41.             }
  42.             if(conn!=null){
  43.                 try {
  44.                     conn.close();
  45.                 } catch (SQLException e) {
  46.                     e.printStackTrace();
  47.                 }
  48.                 conn=null;
  49.             }
  50.         }
  51.     }
  52. }

具體的工具類 

點選(此處)摺疊或開啟

  1. package test;
  2. import java.lang.reflect.Field;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.ResultSetMetaData;
  7. import java.sql.SQLException;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class DbUtils {
  11.     private static String url = "jdbc:mysql://localhost:3306/test";
  12.     private static String username = "root";
  13.     private static String password = "";
  14.     private static String driverClass = "com.mysql.jdbc.Driver";
  15.     //沒什麼好說的,獲取資料庫連線
  16.     public static Connection getConn(){
  17.         Connection conn = null;
  18.         try {
  19.             Class.forName(driverClass);
  20.             conn = DriverManager.getConnection(url,username,password);
  21.         } catch (ClassNotFoundException e) {
  22.             e.printStackTrace();
  23.         } catch (SQLException e) {
  24.             e.printStackTrace();
  25.         }
  26.         return conn;
  27.     }
  28.     /*
  29.      * 將rs結果轉換成物件列表
  30.      * @param rs jdbc結果集
  31.      * @param clazz 物件的對映類
  32.      * return 封裝了物件的結果列表
  33.      */
  34.     public static List populate(ResultSet rs , Class clazz) throws SQLException, InstantiationException, IllegalAccessException{
  35.         //結果集的元素物件 
  36.         ResultSetMetaData rsmd = rs.getMetaData();
  37.         //獲取結果集的元素個數
  38.          int colCount = rsmd.getColumnCount();
  39. //         System.out.println("#");
  40. //         for(int i = 1;i<=colCount;i++){
  41. //             System.out.println(rsmd.getColumnName(i));
  42. //             System.out.println(rsmd.getColumnClassName(i));
  43. //             System.out.println("#");
  44. //         }
  45.          //返回結果的列表集合
  46.          List list = new ArrayList();
  47.          //業務物件的屬性陣列
  48.          Field[] fields = clazz.getDeclaredFields();
  49.          while(rs.next()){//對每一條記錄進行操作
  50.              Object obj = clazz.newInstance();//構造業務物件實體
  51.              //將每一個欄位取出進行賦值
  52.              for(int i = 1;i<=colCount;i++){
  53.                  Object value = rs.getObject(i);
  54.                  //尋找該列對應的物件屬性
  55.                  for(int j=0;j<fields.length;j++){
  56.                      Field f = fields[j];
  57.                      //如果匹配進行賦值
  58.                      if(f.getName().equalsIgnoreCase(rsmd.getColumnName(i))){
  59.                          boolean flag = f.isAccessible();
  60.                          f.setAccessible(true);
  61.                          f.set(obj, value);
  62.                          f.setAccessible(flag);
  63.                      }
  64.                  }
  65.              }
  66.              list.add(obj);
  67.          }
  68.         return list;
  69.     }
  70. }