將ResultSet結果集通過反射轉換成物件LIST集合
阿新 • • 發佈:2019-02-17
說明:Lz新手,通過這個練習反射。(mysql資料庫)
一,簡單的建立一個數據庫,並給上資料。
二、
1.建立一個Emp.java 。
2.建立和 資料庫中各列名一樣的屬性,且為private型別。
3.有一個空構造器。
4.有get/set 方法,重寫toString方法,hashCode和equals方法。
三、寫一個測試類。
public class TestUser {
public static void main(String[] args) {
//查詢所有資訊,輸出List集合
queryAllUserInfo();
}
private static void queryAllUserInfo() {
//建立一個List集合,來裝emp
List<Emp> list=new ArrayList<>();
//宣告連結,在後面獲取連結
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null ;
String sql="select * from t_emp";
try {
//通過自己寫的工具類獲取連結
connection=WyUtil.createConnection();
//獲取preparedstatement
preparedStatement=WyUtil.createPreparedStatement(connection, sql);
resultSet=preparedStatement.executeQuery();
//自己寫的一個resultToList方法,把resultSet的資訊轉換為Emp的物件,並將物件裝進List集合
list=WyUtil.resultToList(resultSet, Emp.class);
} catch (Exception e) {
e.printStackTrace();
}finally {
//通過工具類關閉所有連結
WyUtil.closeAll(connection, preparedStatement, resultSet);
}
//輸出所有物件的資訊
System.out.println(list);
}
//resultToList方法
public static <T> List<T> resultToList(ResultSet resultSet, Class<T> clazz) {
//建立一個 T 型別的陣列
List<T> list = new ArrayList<>();
try {
//通過反射獲取物件的例項
T t = clazz.getConstructor().newInstance();
//獲取resultSet 的列的資訊
ResultSetMetaData metaData = resultSet.getMetaData();
//遍歷resultSet
while (resultSet.next()) {
//遍歷每一列
for (int i = 0; i < metaData.getColumnCount(); i++) {
//獲取列的名字
String fName = metaData.getColumnLabel(i + 1);
//因為列的名字和我們EMP中的屬性名是一樣的,所以通過列的名字獲得其EMP中屬性
Field field = clazz.getDeclaredField(fName.toLowerCase());
//因為屬性是私有的,所有獲得其對應的set 方法。set+屬性名首字母大寫+其他小寫
String setName = "set" + fName.toUpperCase().substring(0, 1) + fName.substring(1).toLowerCase();
//因為屬性的型別和set方法的引數型別一致,所以可以獲得set方法
Method setMethod = clazz.getMethod(setName, field.getType());
//執行set方法,把resultSet中的值傳入emp中, 再繼續迴圈傳值
setMethod.invoke(t, resultSet.getObject(fName));
}
//把賦值後的物件 加入到list集合中
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
}
// 返回list
return list;
}