將對數據庫的增刪改查封裝爲方法

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;
	}
相關文章
相關標籤/搜索