我的位置: 主页 > 技术交流区 >

北大青鸟科海讲堂老师教你:jdbc metadata的用法

时间:2018-12-29 17:05来源:未知 作者:北大青鸟科海技术 点击:
jdbc metadata,称为jdbc元数据,是描述jdbc连接、查询信息的方式。 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的
       jdbc metadata,称为jdbc元数据,是描述jdbc连接、查询信息的方式。Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个实现事先并不了解的数据库。
  1.     DatabaseMetaData:获得连接信息,主要是数据库信息
  2.    ResultSetMetaData:列信息
  3.    ParameterMetaData:参数信息
参考下面的案例


 Connection con = DBUtil.getConnection();
        //  jdbc的连接信息
        DatabaseMetaData cm = con.getMetaData();
        System.out.println(cm.getDatabaseProductName());
        System.out.println(cm.getDatabaseMajorVersion());
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>");
        String sql = "select * from student where id>? and name like ?";


        PreparedStatement ps = con.prepareStatement(sql);
    //参数信息
    ParameterMetaData pmd = ps.getParameterMetaData();
            //通过获取参数个数来提高代码灵活性
            int count = pmd.getParameterCount();
            System.out.println("参数个数:" + count);
            
            //打印数据库参数信息,MySQL的输出并不准确
            for(int i = 1; i <= count; i ++) {
                System.out.print(pmd.getParameterClassName(i) + " ");
                System.out.print(pmd.getParameterType(i) + " ");
                System.out.println(pmd.getParameterTypeName(i));
                
            }
 

        ps.setInt(1,40);
        ps.setString(2,"%王%");//模糊查找
      ResultSet rs = ps.executeQuery();
    //列信息
          ResultSetMetaData rm = rs.getMetaData();
        System.out.println("总共有" + rm.getColumnCount() + "列");
        for (int i = 1; i <= rm.getColumnCount(); i++) {
            System.out.println(rm.getColumnLabel(i) + ","
                    + rm.getColumnTypeName(i));
        }



利用此功能,可以实现类似通用查询的功能,代码片段如下,此方式不能封装对象,只能用Map封装行信息:
 rm为ResultSetMetaData 对象
ResultSet rs = ps.executeQuery();
        List<Map> datas = new ArrayList<Map>();
        while (rs.next()) {
            Map entity = new HashMap();
            for (int i = 1; i <= rm.getColumnCount(); i++) {
                entity.put(rm.getColumnLabel(i),
                        rs.getObject(rm.getColumnLabel(i)));
            }
            datas.add(entity);
        }
        DBUtil.close(rs, ps, con);
        for (Map m : datas) {
            System.out.println(m);
        }



----------------------------分隔线----------------------------