將jdbc結果集ResultSet轉換成物件列表
阿新 • • 發佈:2019-01-29
將jdbc結果集轉換成物件列表
估計hibernate就是用得這種方式進行轉換的。
實體物件
具體的工具類
估計hibernate就是用得這種方式進行轉換的。
實體物件
點選(此處)摺疊或開啟
-
package test;
-
//實體物件,該物件的屬性與資料庫中的欄位相同,當然可以改變具體看需求
-
public class Person {
-
private int id;
-
private int age;
-
private String name;
-
public int getId() {
-
return id;
-
}
-
public void setId(int id) {
-
this.id =
-
}
-
public int getAge() {
-
return age;
-
}
-
public void setAge(int age) {
-
this.age = age;
-
}
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
- }
點選(此處)摺疊或開啟
-
package test;
-
import java
-
import java.sql.Connection;
-
import java.sql.PreparedStatement;
-
import java.sql.ResultSet;
-
import java.sql.SQLException;
-
import java.util.List;
-
public class Main {
-
//用於測試的方法
-
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException
-
Connection conn = DbUtils.getConn();
-
ResultSet rs = null;
-
PreparedStatement psmt = null;
-
System.out.println(conn);
-
try {
-
psmt = conn.prepareStatement("select
* from person");
-
rs = psmt.executeQuery();
-
List list = DbUtils.populate(rs, Person.class);
-
for(int i = 0 ; i<list.size() ; i++){
-
Person per = (Person) list.get(i);
-
System.out.println("person
: id = "+per.getId()+"
name = "+per.getName()+"
age = "+per.getAge());
-
}
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}finally{
-
if(rs!=null){
-
try {
-
rs.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
rs=null;
-
}
-
if(psmt!=null){
-
try {
-
psmt.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
psmt=null;
-
}
-
if(conn!=null){
-
try {
-
conn.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
conn=null;
-
}
-
}
-
}
- }
具體的工具類
點選(此處)摺疊或開啟
-
package test;
-
import java.lang.reflect.Field;
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.ResultSet;
-
import java.sql.ResultSetMetaData;
-
import java.sql.SQLException;
-
import java.util.ArrayList;
-
import java.util.List;
-
public class DbUtils {
-
private static String url = "jdbc:mysql://localhost:3306/test";
-
private static String username = "root";
-
private static String password = "";
-
private static String driverClass = "com.mysql.jdbc.Driver";
-
//沒什麼好說的,獲取資料庫連線
-
public static Connection getConn(){
-
Connection conn = null;
-
try {
-
Class.forName(driverClass);
-
conn = DriverManager.getConnection(url,username,password);
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
return conn;
-
}
-
/*
-
* 將rs結果轉換成物件列表
-
* @param rs jdbc結果集
-
* @param clazz 物件的對映類
-
* return 封裝了物件的結果列表
-
*/
-
public static List populate(ResultSet rs , Class clazz) throws SQLException, InstantiationException, IllegalAccessException{
-
//結果集的元素物件
-
ResultSetMetaData rsmd = rs.getMetaData();
-
//獲取結果集的元素個數
-
int colCount = rsmd.getColumnCount();
-
// System.out.println("#");
-
// for(int i = 1;i<=colCount;i++){
-
// System.out.println(rsmd.getColumnName(i));
-
// System.out.println(rsmd.getColumnClassName(i));
-
// System.out.println("#");
-
// }
-
//返回結果的列表集合
-
List list = new ArrayList();
-
//業務物件的屬性陣列
-
Field[] fields = clazz.getDeclaredFields();
-
while(rs.next()){//對每一條記錄進行操作
-
Object obj = clazz.newInstance();//構造業務物件實體
-
//將每一個欄位取出進行賦值
-
for(int i = 1;i<=colCount;i++){
-
Object value = rs.getObject(i);
-
//尋找該列對應的物件屬性
-
for(int j=0;j<fields.length;j++){
-
Field f = fields[j];
-
//如果匹配進行賦值
-
if(f.getName().equalsIgnoreCase(rsmd.getColumnName(i))){
-
boolean flag = f.isAccessible();
-
f.setAccessible(true);
-
f.set(obj, value);
-
f.setAccessible(flag);
-
}
-
}
-
}
-
list.add(obj);
-
}
-
return list;
-
}
- }