利用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;  }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏osc同步分享

java注解示例程序

MyAnno.java package com.yawn.annotation; import java.lang.annotation.Documented...

33614
来自专栏Netkiller

Java 反射,开发框架必备技能

反射一般开发者接触不到,反射主要用户框架的开发。例如我举一个例子你就明白了: http://www.netkiller.cn/news/list/2.html...

2675
来自专栏懒人开发

java反射与注解(二):Constructor类理解

这里Constructor,我们知道是构造函数 为什么是数组形式的呢? 因为可能有多个构造 这个时候,我们写一个DummyClass2, 这里有2个构造 ...

1144
来自专栏Netkiller

Spring boot with Service

本文节选自《Netkiller java 手札》 5.7. Service 5.7.1. Application @ComponentScan({ "web",...

2805
来自专栏与神兽党一起成长

使用Mockito修改Bean的依赖

在使用单元测试时经常会遇到某些dependency依赖了外部资源,或者想主动绕过真正的方法执行mock返回结果而快速得到单元测试最终的期望结果,可能有以下两种场...

302
来自专栏代码拾遗

反射基础之Field

java.lang.reflect.Field 类的方法可以查询字段的信息。比如:名字,类型,修饰符和注解。同样也有方法可以动态访问和修改字段的值。

791
来自专栏代码拾遗

反射基础之Method

一个方法声明包括:方法名,描述符,参数,返回类型和异常。可以通过java.lang.reflect.Method类获取这些信息。 下面的例子说明了如何获取一个类...

593
来自专栏代码拾遗

​反射基础之Enum

因为枚举也是一个类,所以也可以通过Field,Method,Constructor的反射API获取其他信息:

703
来自专栏一枝花算不算浪漫

List的多维度排序案例演示~

3377
来自专栏代码拾遗

反射基础之Constructor

构造器的声明包含了:名字,修饰符,参数和异常。可以通过java.lang.reflect.Constructor类获取这些信息。 下面的例子描述了如何获取构造器...

761

扫码关注云+社区