ResultSetMetaData能够通过ResultSet分析出结果集的元素。
ResultSetMetaData meta = rs.getMetaData();
通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等。
可以将ResultSet放入Map(key:列名 value:列值)。
用反射ResultSetMetaData将查询结果读入对象中(简单的O/RMapping)
1)让SQL语句中列别名和要读入的对象属性名一样;
2)通过ResultSetMetaData获得结果列数和列别名;
3)通过反射将对象的所有setXxx方法找到;
4)将3)找到的方法setXxx和2)找到的列别名进行匹配(即方法中的xxx于列别名相等);
5)由上一步找到的方法和列别名对应关系进行赋值
Method.invoke(obj, rs.getObject(columnAliasName));
public class ResultSetMetaDataTest {
public static void main(String[] args) throws SQLException {
List<Map<String, Object>> datas = read("select id, name as n from user where id < 5");
System.out.println(datas);
}
static List<Map<String, Object>> read(String sql) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//列的数目
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
// System.out.print(rsmd.getColumnClassName(i) + "\t");
// System.out.print(rsmd.getColumnName(i) + "\t");
// System.out.println(rsmd.getColumnLabel(i));
colNames[i - 1] = rsmd.getColumnLabel(i);//将列的名称放到一个数组当中去。
}
List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
while (rs.next()) {
//每一行
Map<String, Object> data = new HashMap<String, Object>();
//data中的Key为列的名称,Value是些列的值
for (int i = 0; i < colNames.length; i++) {
data.put(colNames[i], rs.getObject(colNames[i]));
//将列的名称与列的值放到map当中去,每一行map中的元素大小就是列的数目
}
datas.add(data);//将此行放到List当中去。 }
return datas;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
}
ResultSetMetaData meta = rs.getMetaData();
通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等。
可以将ResultSet放入Map(key:列名 value:列值)。
用反射ResultSetMetaData将查询结果读入对象中(简单的O/RMapping)
1)让SQL语句中列别名和要读入的对象属性名一样;
2)通过ResultSetMetaData获得结果列数和列别名;
3)通过反射将对象的所有setXxx方法找到;
4)将3)找到的方法setXxx和2)找到的列别名进行匹配(即方法中的xxx于列别名相等);
5)由上一步找到的方法和列别名对应关系进行赋值
Method.invoke(obj, rs.getObject(columnAliasName));
public class ResultSetMetaDataTest {
public static void main(String[] args) throws SQLException {
List<Map<String, Object>> datas = read("select id, name as n from user where id < 5");
System.out.println(datas);
}
static List<Map<String, Object>> read(String sql) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//列的数目
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
// System.out.print(rsmd.getColumnClassName(i) + "\t");
// System.out.print(rsmd.getColumnName(i) + "\t");
// System.out.println(rsmd.getColumnLabel(i));
colNames[i - 1] = rsmd.getColumnLabel(i);//将列的名称放到一个数组当中去。
}
List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
while (rs.next()) {
//每一行
Map<String, Object> data = new HashMap<String, Object>();
//data中的Key为列的名称,Value是些列的值
for (int i = 0; i < colNames.length; i++) {
data.put(colNames[i], rs.getObject(colNames[i]));
//将列的名称与列的值放到map当中去,每一行map中的元素大小就是列的数目
}
datas.add(data);//将此行放到List当中去。 }
return datas;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
}