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;
}