第一步:在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中的字段名匹配。