1.遍历结果集:
【总结】
两种思想:
面向接口编程的思想
ORM编程思想:(object relational mapping)
- 一个数据表对应一个java类
- 表中的一条记录对应java类的一个对象
- 表中的一个字段对应java类的一个属性
两种技术:
1.使用结果集的元数据:ResultSetMetaData
getColumnCount():获取列数
getColumnLabel():获取列的别名
//说明:如果sql中没给字段其别名,getColumnLabel()获取的就是列名
- 反射的使用(①创建对应的运行时类的对象 ② 在运行时,动态的调用指定的运行时类的属性、方法)
查询的图示:
2.代码举例
/**
* 针对于customers表的通用的查询操作
* @param sql 要执行的SQL语句
* @param args 多少个占位符
*/
public Customer queryForCustomer(String sql,Object...args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection("test");
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1,args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据 :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()){
//方法一:// 下标取出,程序不健壮
/*String ename = rs.getString(1);
String job = rs.getString(2);
String sal = rs.getString(3);*/
//方法二:字段名称取出,当某一个字段名称重命名后,则用新的名称查询
/*String ename = rs.getString("ename");
String job = rs.getString("job");
String sal = rs.getString("s");*/
// 以指定的格式取出
//String ename = rs.getString("ename");
//String job = rs.getString("job");
//Double sal = rs.getDouble("s ");
Customer cust = new Customer();
for (int i = 0; i < columnCount; i++) {
//获取每个列的列值:通过ResultSet
Object columValue = rs.getObject(i + 1);
//通过ResultSetMetaData
//获取列的列名:getColumnName() --不推荐使用
//获取列的别名:getColumnLabel()
String columnLabel = rsmd.getColumnLabel(i + 1);
//通过反射,将对象指定名columnName的属性赋值为指定的值columnValue
Field filed = Customer.class.getDeclaredField(columnLabel);
filed.setAccessible(true);
filed.set(cust,columValue);
}
return cust;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(conn,ps,rs);
}
return null;
}