//查询方法 利用了泛型和反射机制
public <T> List<T> operQuery(String sql,List<Object> params,Class<T> cls) throws Exception{
//准备连接
Connection conn = null;
//准备预编译的sql语句
PreparedStatement pstmt = null;
//执行sql得到的结果集
ResultSet rs = null;
//装载对象的集合(结果集)
List<T> data = new ArrayList<T>();
try {
conn = getConn();
pstmt = conn.prepareStatement(sql);
if (params != null) {
//sql语句可能是完整的,不带?号的
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(i + 1, params.get(i));
}
}
//执行sql语句
rs = pstmt.executeQuery();
/*把查询出来的东西封装成结果集
* 得到记录集元数据对象,通过此对象可以得到表的结构。
* 包括 列名,列的个数,列的数据类型
* */
//从结果集中获取元数据
ResultSetMetaData rst = rs.getMetaData();
int count = rst.getColumnCount();
//依次取出数据
while(rs.next()) {
T m = cls.newInstance(); //反射机制
for(int i=1;i<=count;i++) {
String colName = rst.getColumnName(i); //获得列名
Object value = rs.getObject(i); //取出表中的数据
Field field = cls.getDeclaredField(colName); //获取对象属性
field.setAccessible(true); //更改权限
field.set(m,value); //给私有属性赋值
}
data.add(m);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(rs, pstmt, conn); //定义一个释放全部资源的方法
}
return data;
}
在学习jdbc连接数据库的时候,对数据库中的数据进行操作。总是碰到这种情况,增加,删除,修改,这三种可以统一的用更新(update)这种方法来解决,但是查询不能,因为查询返回来的值是不确定的,可能是一个JavaBean对象,也有可能是一组JavaBean对象,分开写就比较麻烦,所以可以这个方法来实现。