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;
    	}
    
  • 相关阅读:
    拉钩爬取部分重写
    树莓派yolov3 测试训练结果时出现段错误或总线错误解决方法
    服务注册与发现【Eureka】- Eureka自我保护
    服务注册与发现【Eureka】- 服务发现Discovery
    服务注册与发现【Eureka】- 集群Eureka构建步骤
    服务注册与发现【Eureka】- 单机Eureka构建步骤
    服务注册与发现【Eureka】- Eureka简介
    SpringCloud正式开发前 -- 基础项目框架搭建
    服务注册与发现【Zookeeper】
    【校招】【内推】【阿里云】 ECS、神龙计算平台招聘|【经验分享】
  • 原文地址:https://www.cnblogs.com/niuxiao12---/p/7474667.html
Copyright © 2011-2022 走看看