1 封装步骤
2 利用Java的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
3 对增删改的封装
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 类中的属性一一对应)
/** * 列名必须和 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; }