元数据

元数据

什么是元数据

元数据就是定义数据的数据,打个比方,就好像我们要想搜索一首歌(歌本身是数据),而我们可以通过歌名,作者,专辑等信息来搜索,那么这些歌名,作者,专辑等等就是这首歌的元数据。因此数据库的元数据就是一些注明数据库信息的数据。

我们一般使用JDBC来处理数据库的接口主要有三个:Connection、PreparedStatement、ResultSet,现在我们可以通过他们的子类实现对象获得不同的数据库元数据对象

  1. 由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象

  2. 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象

  3. 由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。结果集元数据

下面分别对这三个元数据进行介绍

DatabaseMetaData对象

//获取Connection元数据
Connection.getMetaData()

主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等,能获取的信息比较多。
以下有一些关于DatabaseMetaData的常用方法:

  • getDatabaseProductName:获取数据库的产品名称

  • getDatabaseProductName:获取数据库的版本号

  • getUserName:获取数据库的用户名

  • getURL:获取数据库连接的URL

  • getDriverName:获取数据库的驱动名称

  • driverVersion:获取数据库的驱动版本号

  • isReadOnly:查看数据库是否只允许读操作

  • supportsTransactions:查看数据库是否支持事务

@Test
public void test() throws SQLException {
    //获取Connection连接
    Connection conn = JDBCUtils.getConnection();
    //获取Connection元数据对象
    DatabaseMetaData metaData = conn.getMetaData();
    String databaseProductName = metaData.getDatabaseProductName();
    System.out.println("数据库的产品名称\t"+databaseProductName);
    String databaseProductVersion = metaData.getDatabaseProductVersion();
    System.out.println("数据库的版本号\t"+databaseProductVersion);
    String userName = metaData.getUserName();
    System.out.println("数据库的用户名\t"+userName);
    String url = metaData.getURL();
    System.out.println("数据库连接的URL\t"+url);
    String driverName = metaData.getDriverName();
    System.out.println("数据库的驱动名称\t"+driverName);
    String driverVersion = metaData.getDriverVersion();
    System.out.println("数据库的驱动版本号\t"+driverVersion);
    boolean readOnly = metaData.isReadOnly();
    System.out.println("数据库是否只允许读操作号\t"+readOnly);
    boolean supportsTransactions = metaData.supportsTransactions();
    System.out.println("数据库是否支持事务\t"+supportsTransactions);
}

运行结果

image

ParameterMetaData对象

ParameterMetaData是由PreparedStatement对象通过getParameterMetaData方法获取而来

要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息

  • getParameterCount:获取预编译SQL语句中占位符参数的个数

ParameterMetaData对象能用的只有获取参数个数的getParameterCount()方法。

注意:ParameterMetaData许多方法MySQL并不友好支持,比如像获取指定参数的SQL类型的getParameterType方法,如果数据库驱动连接URL只是简单的“jdbc:mysql://localhost:3306/myDatabase”那么MyEclipse会抛出SQLException异常,必须要将URL修改为“jdbc:mysql://localhost:3306/myDatabase?generateSimpleParameterMetadata=true”才行。但是像getParameterType等等与其他的方法也没多好用,因为如下面的例子,这些方法好像只会将所有的参数认为是字符串(VARCHAR)类型。

image

@Test
public void test() throws SQLException {
    //获取Connection连接
    Connection conn = JDBCUtils.getConnection();
    //准备sql语句
    String sql = "Select * from t_user where name = ? and password = ?";
    //获取PreparedStatement对象
    PreparedStatement pstatm = conn.prepareStatement(sql);
    //获取ParameterMetaData对此PreparedStatement元数据
    ParameterMetaData parMeta = pstatm.getParameterMetaData();

    //获取参数个数
    int paramCount = parMeta.getParameterCount();
    System.out.println(paramCount);
    //以字符串形式获取指定参数的SQL类型,这里有问题
    String paramTypeName = parMeta.getParameterTypeName(1);
    System.out.println(paramTypeName);
    //返回指定参数的SQL类型,以java.sql.Types类的字段表示,这里有问题
    int paramType = parMeta.getParameterType(1);
    System.out.println(paramType);
    //返回指定参数类型的Java完全限定名称,这里有问题
    String paramClassName = parMeta.getParameterClassName(1);
    System.out.println(paramClassName);
    //返回指定参数的模,,这里有问题
    int paramMode = parMeta.getParameterMode(1);
    System.out.println(paramMode);
    //返回指定参数的列大小,这里有问题
    int precision = parMeta.getPrecision(1);
    System.out.println(precision);
    //返回指定参数的小数点右边的位数,这里有问题
    int scale = parMeta.getScale(1);
    System.out.println(scale);
}

运行结果


image

因此在以后使用参数元数据ParameterMetaData尽量只要使用其getParamterCount()方法获取参数个数,对于该对象其他方法请慎用。

ResultSetMetaData对象

ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。

以下有一些关于ResultSetMetaData的常用方法:

  • getColumnCount:获取结果集中列项目的个数

  • getColumnType:获取指定列的SQL类型对应于Java中Types类的字段

  • getColumnTypeName:获取指定列的SQL类型

  • getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)

  • getColumnName:获取指定列SQL类型对应于Java中的类型(包名加类名)

  • getColumnLable:获取指定列SQL类型对应于Java中的类型(包名加类名)

@Test
public void test() throws SQLException {
    //获取Connection连接
    Connection conn = JDBCUtils.getConnection();
    //准备sql语句
    String sql = "Select uid as id,uname,password from t_user";
    //获取PreparedStatement对象
    PreparedStatement pstatm = conn.prepareStatement(sql);
    //获取结果集
    ResultSet rs = pstatm.executeQuery();
    //获得结果集元数据
    ResultSetMetaData resultMetaData = rs.getMetaData();
    
    //获取结果集的列数
    int columnCount = resultMetaData.getColumnCount();
    System.out.println(columnCount);
    //获取指定列的名称
    String columnName = resultMetaData.getColumnName(1);
    System.out.println(columnName);
    //获取指定列的名称(有别名则为别名)
    String columnLable = resultMetaData.getColumnLabel(1);
    System.out.println(columnLable);
    //获取指定列的SQL类型对应于java.sql.Types类的字段
    int columnType = resultMetaData.getColumnType(1);
    System.out.println(columnType);
    //获取指定列的SQL类型
    String columnTypeName = resultMetaData.getColumnTypeName(1);
    System.out.println(columnTypeName);
    //获取指定列SQL类型对应于Java的类型
    String className= resultMetaData.getColumnClassName(1);
    System.out.println(className);
    //获取指定列所在的表的名称
    String tableName = resultMetaData.getTableName(1);
    System.out.println(tableName);
}

运行结果


image

参考博客
https://www.cnblogs.com/fjdingsd/p/5273277.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容