1.先利用SQL进行查询,得到结果集
2.利用反射创建实体类的对象:创建Student对象
3.获取结果集的列的别名:idCard、studentName
4.再获取结果集的每一列的值,结合3得到一个Map键值对。键:列的别名;值:列的值。
5.再利用反射为2对应的属性赋值,属性即为Map的键,值即为Map的值。
ResultSetMetaData
是什么:是描述ResultSet的元数据对象。即从中可以获取到结果集中有多少列,列名是什么…
如何用:
得到ResultSetMetaData对象:调用ResultSet的getMetaData()方法
常用好用的方法:
int getColumnCount():SQL语句中包含了哪些列
String getColumnLabel(int column):获取指定的列的别名,从1开始。
ResultSetMetaData测试
public void testResultSetMetaData() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select id, username, pwd, regTime, lastLoginTime from t_user where id = ?";
conn = JDBCTools.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, 1);
rs = ps.executeQuery();
// 1. 得到ResultSetMetaData对象
ResultSetMetaData rsmd = rs.getMetaData();
// 2. 打印每一列的列名
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
System.out.println(columnLabel);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(rs, ps, conn);
}
}
取出列的别名和值
public void testResultSetMetaData() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select id, username, pwd, regTime, lastLoginTime from t_user where id = ?";
conn = JDBCTools.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, 1);
rs = ps.executeQuery();
Map<String, Object> values = new HashMap<>();
// 1. 得到ResultSetMetaData对象
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
// 2. 打印每一列的列名
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = rs.getObject(columnLabel);
values.put(columnLabel, columnValue);
}
}
System.out.println(values);
Class clazz = User.class;
Object object = clazz.newInstance();
for (Map.Entry<String, Object> entry: values.entrySet()){
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
System.out.println(fieldName + ": " + fieldValue);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(rs, ps, conn);
}
}
通用的查询方法代码
public <T> T get(Class<T> clazz, String sql, Object... args) {
T entity = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCTools.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
Map<String, Object> values = new HashMap<>();
ResultSetMetaData rsmd = rs.getMetaData();
if (rs.next()) {
// 利用反射创建对象
entity = clazz.newInstance();
// 通过解析sql语句来判断到底选择了哪些列,以及需要为entity对象的哪些属性赋值
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = rs.getObject(columnLabel);
values.put(columnLabel, columnValue);
}
}
for (Map.Entry<String, Object> entry : values.entrySet()) {
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
System.out.println(fieldName + ": " + fieldValue);
}
// 这里要加入ReflectionUtils方法,将map的内容写入entity中,并返回entity
// 6. 关闭数据库资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(rs, ps, conn);
}
return entity;
}