将对数据库的增删改查封装为方法

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;
	}
原文地址:https://www.cnblogs.com/niuxiao12---/p/7474667.html