1 封裝步驟java
2 利用Java的反射機制sql
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;spa
這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。對象
3 對增刪改的封裝blog
public static int dml(String sql, Object ...objects) { int count = 0; try (Connection conn = DBUtil.getConnection();) { try (PreparedStatement ps = conn.prepareStatement(sql);) { for (int i = 0; i < objects.length; i++) { // 把 sql 語句中的 ? 替換爲參數 ps.setObject(i + 1, objects[i]); } count = ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } return count; }
4 對查詢進行封裝(列名必須和 Model 類中的屬性一一對應)get
/** * 列名必須和 Model 類中的屬性一一對應 * @param sql 查詢的 SQL 語句 * @param clazz 查詢結果的類型(User,Topic,CategoryDTO,...) * @param objects SQL 語句中的參數 */ public <T> List<T> select(String sql, Class<T> clazz, Object ...objects) { ArrayList<T> list = new ArrayList<T>(); try (Connection conn = DBUtil.getConnection();) { try (PreparedStatement ps = conn.prepareStatement(sql);) { for (int i = 0; i < objects.length; i++) { ps.setObject(i + 1, objects[i]); } try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { // 遍歷查詢結果,封裝爲對象 // 建立對象 T obj = clazz.newInstance(); // user = new User(); // 經過反射獲取對象中的全部屬性 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 獲取屬性的名字 String fieldName = field.getName(); // 經過屬性名獲取結果集中對應列的值 String getMethodName = "get" + field.getType().getSimpleName(); // 拼接 getLong 方法 Method getMethod = rs.getClass().getMethod(getMethodName, String.class); // 獲取 getLong 方法對象 Object value = getMethod.invoke(rs, fieldName);// 掉用 getLong 方法 ==== Long id = rs.getLong("id"); // 必須經過 set 方法爲屬性賦值 // id setId,屬性的類型就是 set 方法對應的參數類型 String first = fieldName.substring(0, 1).toUpperCase();// 屬性首字母大寫 String setMethodName = "set" + first + fieldName.substring(1);// 拼接 set 方法名稱 Method setMethod = clazz.getMethod(setMethodName, field.getType());// 獲取 set 方法對象 setMethod.invoke(obj, value);// 調用 set 方法 === user.setId(id); } list.add(obj); } } } } catch (SQLException e) { e.printStackTrace(); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException | InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }