zoukankan      html  css  js  c++  java
  • 将对数据库的增删改查封装为方法

    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;
    	}
    
  • 相关阅读:
    项目开发目录
    语法 部分
    time模块
    文件 部分
    二分法
    函数 部分
    递归
    模块 部分
    稀疏数组
    Java中使用foreach遍历数组
  • 原文地址:https://www.cnblogs.com/niuxiao12---/p/7474667.html
Copyright © 2011-2022 走看看