JDBC_利用Java反射技術將查詢結果封裝爲對象

將學習成果分享給大家。

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import com.itcast.jdbc.domain.User;

//JDBC_利用Java反射技術將查詢結果封裝爲對象
public class CRMTest
{

 public static void main(String[] args) throws Exception
 {

  //另外一種解決方法名爲題爲
  //sql = "select id as Id,name as Name,birthday as Birthday,money as Money from user where id = 3"
  String sql = "select * from user where id = 3";
  //類必須有空的構造函數
  User user = (User) getObject(sql,User.class);
  System.out.println(user);
 }

 public static Object getObject(String sql, Class clazz) throws Exception
 {
  {
   Connection conn = null;
   ResultSet rs = null;
   PreparedStatement ps = null;

   try
   {
    conn = JdbcUtils.getConnection();
    ps = conn.prepareStatement(sql);

    rs = ps.executeQuery();

    ResultSetMetaData rsmt = rs.getMetaData();

    int count = rsmt.getColumnCount();

    String[] colNames = new String[count];

    // 數據庫的列數除了主鍵id,從列下標1開始
    for (int i = 1; i <= count; i++)
    {
     // System.out.print(rsmt.getColumnClassName(i)+"\t");
     // System.out.print(rsmt.getColumnName(i)+"\t");
     // System.out.println(rsmt.getColumnLabel(i)); 列的別名
     // 爲了防止出現列別名引起列不全,採用Lable
     colNames[i - 1] = rsmt.getColumnLabel(i);
    }

    Object object = null;
    Method ms[] = clazz.getMethods();

    if (rs.next())
    {
     object = clazz.newInstance();//實例化對象
     for (int i = 0; i < colNames.length; i++)
     {
      String colName = colNames[i];
      String methodName = "set" + colName;

      for (Method m : ms)
      {
       //爲了解決methodName與設置屬性的方法名一致
       if (methodName.equals(m.getName().toLowerCase()))
       {
        //反射,將實例對象,和方法名注入方法域中
        m.invoke(object, rs.getObject(colName));
       }

      }

     }
     
    }
    return object;
   } finally
   {
    JdbcUtils.free(rs, ps, conn);
   }
  }
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章