• 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;
    }
  • 相关阅读:
    主流软件系统类别
    vue 生命周期
    redis 实现多属性查询
    业务逻辑层缓存设计
    ORM 缓存
    keepalived+nginx实现niginx高可用,宕机自动重启
    cookie sessionstorge localstorge 的比较
    css 定位
    2019年1月2日 生产者消费者模型 元旦快乐
    2018年12月25日 圣诞节快乐 生成器plus
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308981.html
Copyright © 2020-2023  润新知