zoukankan      html  css  js  c++  java
  • JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

    /**-利用反射及JDBC元数据编写通用的查询方法
    * 1.先利用SQl语句进行查询,得到结果集-->
    * 2.查找到结果集的别名:id-->
    * 3.利用反射创建实体类的对象,创建author对象-->
    * 4.获取结果集的列的别名: id,nation,name
    * 5.再获得结果集的每一列的值,
    * 结合2得到一个map键值对: 键: 列的别名,值: 列的值: {id=1,nation=中国,name=莫言}
    * 6.再利用反射为2的对应的属性赋值,属性为Map 的键,值为Map 的值!
    *    7.针对每轮查询,遍历map结果集,整合进对象,进行输出或者其他操作;
    */

    代码:

    /**ResultSetMetaData 简介
     *      定义: 是描述ResultSet 的元数据对象,即从中可以或许到结果集中有多少列,列名是什么...
     *      用法:
     *          得到ResultSetMetaData 对象: 调用ResultSet的 getMetaData()方法即可!
     *      ResultSetMetaData的常用方法:
     *          >int getColumnCount() : SQL语句中包含的列的总个数
     *          >String getColumnLabel(int column) : 获取指定的列的别名,其中索引从1开始;
     *
     */
    public class testResultSetMetaData {
        @Test
        public void testResultSetMetaData(){
            Connection connection=null;
            PreparedStatement preparedStatement=null;
            ResultSet resultSet=null;
            try {
                String sql="select id,author_name name,nation "+
                        "from author where id <= ?";
                connection = JDBCTools.getConnection();
                preparedStatement=connection.prepareStatement(sql);
                preparedStatement.setInt(1,5 );
                resultSet=preparedStatement.executeQuery();
    
                Map<String,Object> values=new HashMap<String,Object>();
                //1. 得到ResultSetMetaData 对象
                while (resultSet.next()) {
                    //2.打印每一列的列名
                    ResultSetMetaData rsmd=resultSet.getMetaData();
                    for (int i = 0; i < rsmd.getColumnCount(); i++) {
                        String columnLabel = rsmd.getColumnLabel(i + 1);   //获取列表标签名称
                      //  System.out.print("
    " + columnLabel + "	");
                        Object columnValue=resultSet.getObject(columnLabel);  //根据名称,获取列值,存入HashMap
                        values.put(columnLabel,columnValue );
                    }
                    //System.out.println(values);  //获取一组结果 ,重复的键值对会被后面的覆盖掉
                    Class clazz=author.class;
                    Object object=clazz.newInstance();
                    for(Map.Entry<String,Object> entry: values.entrySet()){
                        String fieldName = entry.getKey();
                        Object fieldValue = entry.getValue();
                        System.out.print("	"+fieldName+"-->"+fieldValue);
    
                    }
                    System.out.print("
    ******************");
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCTools.release(resultSet,preparedStatement ,connection);
            }
        }
    }

    结果:

    com.mysql.jdbc.JDBC4Connection@19e1023e    
    
                          nation-->中国    name-->莫言    id-->1
    ******************    nation-->中国    name-->村上春树    id-->2
    ******************    nation-->中国    name-->山枫叶纷飞    id-->3
    ******************    nation-->北京    name-->刘慈欣    id-->4
    ******************    nation-->元星    name-->瑞    id-->5
    ******************
    
    
  • 相关阅读:
    Yii2中多表关联查询(join、joinwith)
    Yii2.0实用功能技巧解密之——分页功能
    Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析
    Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作
    Yii2.0源码分析之——主题(Theme)
    Yii2.0源码分析之——YiiBase自动加载类、引用文件(autoload)
    MySQL 性能调优的10个方法
    PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–算法
    ThinkPHP3.2.3验证码显示、刷新、校验
    Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9990453.html
Copyright © 2011-2022 走看看