package com.jelly.reflect;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import com.jelly.beans.User;
import com.jelly.utils.JDBCUtil;
public class JavaBeanReflect implements Serializable{
//
private static final long serialVersionUID = 1L;
//
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
/**
* 根據名字獲取對應的set方法
* @param name
* @return
*/
private String getMethodName(String fieldName){
if(fieldName == null || "".equals(fieldName.trim())){
return null;
}
String n = fieldName.substring(0, 1);
return "set"+fieldName.replaceFirst(n,n.toUpperCase());
}
/**
* 根據名字獲取方法類型
* @param clazz
* @param fieldName
* @return
*/
@SuppressWarnings("finally")
private Class<?> getFieldType(Class<?> clazz,String fieldName){
Class<?> c = null;
try {
Field field = clazz.getDeclaredField(fieldName);
c = field.getType();
} catch (Exception e) {
e.printStackTrace();
} finally{
return c;
}
}
/**
* 將數據轉換成對象
* @param
* @param clazz
* @param rs
* @return
* @throws Exception
*/
private T getT(Class clazz,ResultSet rs) throws Exception{
ResultSetMetaData rsmd = rs.getMetaData();
Integer count = rsmd.getColumnCount();
T t= clazz.newInstance();
for(int i=1; i<=count; i++){
//獲得列名
String columnName = rsmd.getColumnName(i);
//獲取方法名
String setMethodName = getMethodName(columnName);
//獲得方法類型
Class<?> fieldType = getFieldType(clazz, columnName);
//
Method method = clazz.getMethod(setMethodName, fieldType);//
//調用方法 因爲set方法一般就一個參數。所以這兒沒有判斷參數個數
method.invoke(t, rs.getObject(columnName));
}
count = null;
return t;
}
/**
* 查詢所有數據
* @param
* @param clazz
* @return
*/
public List select(Class clazz){
List list = new ArrayList();
try {
conn = JDBCUtil.getConnection();
pstmt = conn.prepareStatement("select * from user");
rs = pstmt.executeQuery();
while(rs.next()){
list.add(getT(clazz,rs));
}
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCUtil.closeConnection(rs, pstmt, conn);
}
return list;
}
public static void main(String [] args) throws Exception{
JavaBeanReflect tr = new JavaBeanReflect();
List list = tr.select(User.class);
for(User user : list){
System.out.println(user.toString());
}
}
}
使用java反射將數據庫結果集轉換成對象結果集
以前沒弄過,不知道有沒有更好更簡單的辦法,如果有請告訴我一下。謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.