Java - Use Commons BeanUtils library to display query results

一般來說我們在利用JDBC Library與資料庫溝通時,如果僅僅使用原生的函式來呈現ResultSet

的資料,在使用上還蠻不方便的,假設資料表的欄位過多的話! 因此在這邊將使用Commons

BeanUtils Library來將ResultSet做包裝,再利用property的copy屬性值函式來將資料庫取得的

資料複製到相對應的JavaBeans實體屬性下,如此一來可以減少做setter的工作。

首先您需要具備相關的函式庫,如下:

commons-beanutils-1.9.2.jar
commons-collections-3.1.jar
org-apache-commons-logging.jar
sqljdbc4.jar

緊接著,請定義相對應各資料表的JavaBeans。請記得您在資料表下要取出的欄位資料,其

名稱要相對應至JavaBeans的成員變數。

public class Employees {
 private int Employeeid;
 private String Employeename;
 private String Department;
 private BigDecimal Salary;

 public int getEmployeeid() {
  return Employeeid;
 }

        ....略過
}
public class IncomeRecord {
 private String year;
 private String month;
 private String id;
 private String source;
 private BigDecimal income;
 public String getYear() {
  return year;
 }
 public void setYear(String year) {
  this.year = year;
 }
        ....略過

再來就是撰寫主要的程式

public void showBeanList(String query, Class<?> clazz)throws Exception{
  PreparedStatement getRowsList = m_conn.prepareStatement(query);
  ResultSet rs = getRowsList.executeQuery();
  
  RowSetDynaClass rsdc = new RowSetDynaClass(rs);
  List<DynaBean> rows = rsdc.getRows();
  List<String> propertyList = new ArrayList<String>();
  for(DynaProperty d : rsdc.getDynaProperties()){
   System.out.println("*********property name:"+d.getName());
   propertyList.add(d.getName());
  } 
  for(int i = 0 ; i < rows.size() ; i++){
   Object bean = clazz.newInstance();
   PropertyUtils.copyProperties(bean, rows.get(i));
   System.out.println(bean);
  }
  System.out.println("============================");
 }

這支method所傳入的參數為查詢的SQL語法及JavaBeans的類別物件(Employees.class),

PS. Employees.class 如同object.getClass() => Returns the runtime class of this Object.

要取得實體時,會使用類別物件呼叫newInstance()可以動態的產生對應類別的實體


在此將使用RowSetDynaClass類別將rs做包裝後,此時您可以得到所有的資料表的欄位名稱

或者是getRows()所回傳回來的DynaBean型態的List資料。

在這個時候您不用再辛辛苦苦的利用Employees所宣告的物件一個一個屬性做setter值的動作

,您只需要利用PropertyUtils.copyProperties將來源rows.get(i) copy至bean內即可以將各欄位

的資料複製至JavaBeans有定義的成員變數內,最後再做印出的動作做確認!!


留言