利用java反射機制將orcale數據庫中的表反射到類中




import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Test {

 static String driverName = "oracle.jdbc.driver.OracleDriver";
 static String url = "jdbc:oracle:thin:@172.22.246.26:1521:orcl";
 static String user = "java1";
 static String pass = "java1";

 static {
  try {
   Class.forName(driverName);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 public static void main(String[] args) {
  // 定義存儲多個對象的集合
  List<Object> list = new ArrayList<Object>();
  Test t = new Test();
  Class<?> demo = null;
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  Bonus_m bonus = null;
  conn = t.getConnection();

  String sql = "SELECT * FROM bonus_m";
  try {
   pstmt = conn.prepareStatement(sql);
   rs = pstmt.executeQuery();

   // 獲取表的元數據
   ResultSetMetaData rsmd = rs.getMetaData();

   // 獲取表中的列數
   int count = rsmd.getColumnCount();

   demo = Class.forName("com.iflytek.test.Bonus_m");

   // 獲取屬性的數組
   Field[] fields = demo.getDeclaredFields();

   while (rs.next()) {
    bonus = (Bonus_m) demo.newInstance();
    for (int i = 1; i <= count; i++) {
     String colunmName = rsmd.getColumnName(i);
     Object value = rs.getObject(i);

     for (int j = 0; j < fields.length; j++) {
      if (fields[j].getName().equalsIgnoreCase(colunmName)) {
       t.setter(bonus, fields[j].getName(), value, fields[j].getType());
       break;
      }
     }
    }
    list.add(bonus);
   }
   
   t.getter(list, fields);

  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 // 獲取數據庫連接
 public Connection getConnection() {
  Connection conn = null;
  try {
   conn = DriverManager.getConnection(url, user, pass);
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return conn;
 }

 /*
  * @param obj 待操作的對象
  *
  * @param att 待操作的屬性
  *
  * @param value 待設置的值
  *
  * @param type 屬性的類型
  */
 public void setter(Object obj, String att, Object value, Class<?> type) {
  Test t = new Test();
  String filed = t.firstChar2Upper(att).toString();
  try {
   Method method = obj.getClass().getMethod("set" + filed, type);
   method.invoke(obj, value);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void getter(List<Object> list, Field[] fields) {

  /*
   * Bonus_m{"ename":"張三", "":"", "":"", "":""}
   */
  if (list != null) {
   for (Object obj : list) {
    Class<?> cla = obj.getClass();
    StringBuilder builder = new StringBuilder();
    builder.append(cla.getSimpleName()).append("{");

    for (Field field : fields) {
     String fieldName = field.getName();

     try {
      Object value = field.get(obj);

      builder.append("\"").append(fieldName).append("\":");
      builder.append("\"").append(value).append("\"");
      builder.append(",");
     } catch (Exception e) {
      e.printStackTrace();
     }
    }

    builder.deleteCharAt(builder.length() - 1);
    builder.append("}");
    System.out.println(builder);
   }
  }
 }

 /*
  * 修改字符串,將字符串的首字母變成大寫
  */
 public StringBuffer firstChar2Upper(String str) {
  StringBuffer strBuff = new StringBuffer();
  strBuff.append(str.substring(0, 1).toUpperCase()).append(str.substring(1));
  return strBuff;
 }
}




import java.math.BigDecimal;

public class Bonus_m {
 private String ename;
 private String job;
 private BigDecimal sal;
 private BigDecimal comm;

 public String getEname() {
  return ename;
 }

 public void setEname(String ename) {
  this.ename = ename;
 }

 public String getJob() {
  return job;
 }

 public void setJob(String job) {
  this.job = job;
 }

 public BigDecimal getSal() {
  return sal;
 }

 public void setSal(BigDecimal sal) {
  this.sal = sal;
 }

 public BigDecimal getComm() {
  return comm;
 }

 public void setComm(BigDecimal comm) {
  this.comm = comm;
 }

}




發佈了36 篇原創文章 · 獲贊 34 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章