JDBC(五)面向对象编程思想和更新、查询封装

1. ResultSet 的 getMetaData():

ResultSetMetaData rsmd =   rs.getMetaData();
① ResultSetMetaData.getColumnCount():ResultSet的列的个数
② ResultSetMetaData.getColumnLabel(int):ResultSet的列的别名,参数从1开始

2. 更新方法 的封装:

既然学了 PreparedStatement及它的好处 我们就应该将Update 方法重新封装一下,但填充占位符的参数是一个问题:
/**
	 * 通用的更新方法,包括 insert,update,detele 语句.
	 * ① PreparedStatement 是通过 ? 占位符来填充条件的,那我们也得将填充占位符的参数也传过来
	 * ② 解决这一问题可以选择 可变参数数组
	 * @param sql
	 * @param args0 :可变参数数组
	 * @throws Exception 
	 */
	public static void update(String sql,Object...args0) throws Exception{
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			for(int i = 0; i<args0.length; i++){
				ps.setObject(i+1, args0[i]);
			}
			 ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			
			releaseDB(null, ps, conn);
		}
		 
	}

3.面向对象编程之通用查询的封装

分析:其实这就是面向对象编程思想:封装,继承,多态
① 查询的东西(可以说是一个对象,)、查询的SQL 以及查询的参数,我们都不知道,只有在查的时候才知道,该怎么处理。
② SQL 和参数通过Update 方法知道怎么处理,麻烦的是这对象,我们不知道它是什么类型,很难处理。
③ 结合使用泛型、反射解决。
④ 了解更多反射请看:点击打开链接(反射小结)
	/**
	 * 通用的查询方法 返回一个泛型类型的对象 只有select 语句.
	 * @param clazz
	 * @param sql
	 * @param args0
	 * @return
	 */
	public static <T> T serach(Class<T> clazz,String sql,Object...args0){
		T entity = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			for(int i = 0; i<args0.length; i++){
				ps.setObject(i+1, args0[i]);
			}
			rs = ps.executeQuery();
			
			/**
			 * 如何将结果集中的值怎么赋值给对象
			 * ① ResultSetMetaData.getColumnCount():ResultSet的列的个数
			 * ② ResultSetMetaData.getColumnLabel(int):ResultSet的列的别名,参数从1开始
			 * ③ ResultSet.getObject(int): 列的值
			 * ④ 利用别名是我们定义的,我们就可以将别名与类属性名联系起来,就可以利用反射将值赋值给对象
			 */
			ResultSetMetaData rsmd = rs.getMetaData();
			//将别名,列值存入map
			Map<String,Object> map = new HashMap<String, Object> ();
			if(rs.next()){
				for(int i = 0; i<rsmd.getColumnCount();i++){
					map.put(rsmd.getColumnLabel(i+1), rs.getObject(i+1));
				}
			}
			//结果集不能为空
			if(map.size()>0){
				//创建对象
				entity = clazz.newInstance();
				//遍历map, entry 的key 是属性名 value 是属性值
				for(Map.Entry<String, Object> entry : map.entrySet()){
					//获取对象指定的属性
					Field field = clazz.getDeclaredField(entry.getKey());
					//让属性变为可访问(更改)
					field.setAccessible(true);
					//将 entry.getValue() 赋值给 entity 的field 属性
					field.set(entity, entry.getValue());
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			releaseDB(rs, ps, conn);
		}
		
		return entity;
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值