• 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

  • 相关阅读:
    项目风险软考之软工基础知识(1)
    序列输出ZOJ1108 FatMouse's Speed
    电平波特率UART自适应波特率的设置方法
    nullnull2013金山西山居创意游戏程序挑战赛——初赛(3)生日猜猜猜
    删除监听oracle单库彻底删除干净的方法
    类关闭由一个activity启动第二个activity
    代码文件android:向手机卡上写入文件时总是不成功,解决办法
    功能应用程序延迟发送:4款定时发送短信的应用程序
    监听事件android activity中键盘的监听
    nullnull爆笑百家讲坛之十大逆袭情侣.
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13199563.html
Copyright © 2020-2023  润新知