將JDBC結果集轉換成實體對象


第一步:在JDBC工具類中加入轉換方法,用於結果集轉換成對象

package lo.utils;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * JDBC 工具類
 * @author pengYi
 *
 */
public class JDBCUtils {
	
	 public static Connection connection = null;
	 public static PreparedStatement preparedStatement = null;
	 public static ResultSet resultSet = null;
	 	
	 /**
	  * 連接數據庫
	  * @return
	  */
	 public static Connection getConnection(){
		 String url = "jdbc:mysql://localhost:3306/chartroom";
		 String user = "root";
		 String password = "root";
		 try {
			 Class.forName("com.mysql.jdbc.Driver");
			 connection = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		 return connection;
	 }
	 /**
	  * 關閉資源
	  */
	 public static void close(){
		 try{
			 if(connection != null){
				connection.close();	
				connection = null;
			 }
			 if(preparedStatement != null){
				 preparedStatement.close();
				 preparedStatement = null;
			 }
			 if(resultSet!= null){
				 resultSet.close();
				 resultSet = null;
			 }
		 }catch(SQLException e){
			 e.printStackTrace();
		 }
		
	 }
	 /**
	  * 將結果集轉換成實體對象集合
	  * @param res 結果集
	  * @param c 實體對象映射類
	  * @return
	 * @throws SQLException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	  */
	 public static List Populate(ResultSet rs,Class cc) throws SQLException, InstantiationException, IllegalAccessException{
		
		 //結果集 中列的名稱和類型的信息
		 ResultSetMetaData rsm = rs.getMetaData();
		 int colNumber = rsm.getColumnCount();
		 List list = new ArrayList();
		 Field[] fields = cc.getDeclaredFields();
		
		 //遍歷每條記錄
		 while(rs.next()){
			 //實例化對象
			 Object obj = cc.newInstance(); 
			 //取出每一個字段進行賦值
			 for(int i=1;i<=colNumber;i++){
				 Object value = rs.getObject(i);
				 //匹配實體類中對應的屬性
				 for(int j = 0;j<fields.length;j++){
					 Field f = fields[j];
					 if(f.getName().equals(rsm.getColumnName(i))){
						 boolean flag = f.isAccessible();
						 f.setAccessible(true);
						 f.set(obj, value);
						 f.setAccessible(flag);
						 break;
					 }
				 }
				 
			 }
			 list.add(obj);
		 }
		 return list;
	 }
}

  第二步:創建測試類

package lo.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import lo.user.vo.User;

public class Test{
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Connection conn = JDBCUtils.getConnection();      //JDBCUtils 自己定義的一個類
		PreparedStatement pre = null;
		ResultSet res = null;
		String sql = "select * from user where username=?";
		try {
			pre = conn.prepareStatement(sql);
			pre.setString(1,"wqq");
			res = pre.executeQuery();
			//調用將結果集轉換成實體對象方法
			List list = JDBCUtils.Populate(res, User.class);
			//循環遍歷結果
			for(int i=0;i<list.size();i++){
				User user = (User) list.get(i);
				System.out.println("[username = "+ user.getUsername()+",passwd = "+ user.getPassword()+"]");
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 總結:

  重點在於 populate (ResultSet res,Class cc)轉換方法。

  根據穿過來的 cc 創建實例 cc.newInstance();

  ResultSetMetaData 獲得結果集中列的名稱和類型的信息。

  Field 用來放實體類中的字段,這里的每一個字段都是對象。可以通過set(Obj,value) 給字段賦值

    匹配思路:

    1.先遍歷結果集中的每一條記錄。

    2.用ResultSetMetaData 獲得 getColumnCount 列數和getColumnName 列名

    3.結果集中的列名和Field中的字段名匹配。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM