zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    如何用PostMan
    LINQ笔记-LINQ操作DataTable
    EF Core利用Transaction对数据进行回滚保护
    php 替换模板中的 PHP源码标签字符方法
    php读取文件使用redis的pipeline(管道)导入大批量数据
    Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程
    php 版本升高后 会出现 之Deprecated: Function ereg_replace() is deprecated的解决方法
    IIS + FastCGI+php(从5.2升级到5.3)
    Nginx 出现 _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/
    nginx 环境不支持thinkPHP
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308981.html
Copyright © 2011-2022 走看看