MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

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

————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353

猜你喜欢

转载自www.cnblogs.com/qiu-hua/p/13199563.html