Resultset转Bean工具类

来源:互联网 发布:java handler是什么 编辑:程序博客网 时间:2024/05/18 23:58
package org.pandas.webIdp.webOP.help;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;public class ResBeanUntil<T> {/** *  * @param clazz 所要封装的javaBean * @param rs 记录集 * @return ArrayList 数组里边装有 多个javaBean * @throws Exception * @说明:利用反射机制从ResultSet自动绑定到JavaBean;根据记录集自动调用javaBean里边的对应方法。如果javaBean与数据库字段类型不匹配,按String类型封装 */public List<T> getList(Class<T> clazz, ResultSet rs)  {Field field = null;List<T> lists = new ArrayList<T>();// 取得类里边的所有方法try {// 取得ResultSet列名ResultSetMetaData rsmd = rs.getMetaData();// 获取记录集中的列数int counts = rsmd.getColumnCount();// 定义counts个String 变量String[] columnNames = new String[counts];// 给每个变量赋值for (int i = 0; i < counts; i++) {columnNames[i] = rsmd.getColumnLabel(i + 1);}// 变量ResultSetwhile (rs.next()) {T t = clazz.newInstance();// 反射, 从ResultSet绑定到JavaBeane:for (int i = 0; i < counts; i++) {// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了Object value =null;Class<?> dbType =null;//try的意义是在于 获取对象为空时try {value=rs.getObject(columnNames[i]);//这里是获取数据库字段的类型   判断 value是否为空 null的话跳过 dbType =value.getClass();} catch (Exception e) {continue e;}//设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型field = clazz.getDeclaredField(columnNames[i]);Class<?> beanType = field.getType();//如果发生从数据库获取到得类型跟javaBean类型不同,按String类型取吧if(beanType!=dbType){value = rs.getString(columnNames[i]);}String setMethodName = "set" + firstUpperCase(columnNames[i]);// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;Method m = t.getClass().getMethod(setMethodName,beanType);// 第二个参数是传给set方法数据;如果是get方法可以不写m.invoke(t, value);}lists.add(t);}} catch (Exception e) {e.printStackTrace();return null;}return lists;}//首写字母变大写  public static String firstUpperCase(String old){    return old.substring(0, 1).toUpperCase()+old.substring(1);  } }

0 0