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