mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)

问题描述

今天在读取表的注释信息(COMMENT)时,发现返回的REMARKS字段返回居然是null. 以下是代码示例:

DatabaseMetaData meta = this.pConnection.getMetaData();
// 获取所有表信息
ResultSet resultSet = this.meta.getTables(this.catalog, tableSchema, pattern, this.tableTypes);
while (resultSet.next()) {
    Table table = new Table();
    # 返回null
    String comment=resultSet.getString("REMARKS");
}
resultSet.close();

原因分析

google找了半天,总算知道原因: Connector/J 5.0.0以后的版本有一个名为useInformationSchema的数据库连接参数, 在默认连接参数情况下,useInformationSchema=false,导致Connection.getMetaData()方法返回的DatabaseMetaData 对象是com.mysql.jdbc.DatabaseMetaData,而不是com.mysql.jdbc。DatabaseMetaDataUsingInfoSchema, DatabaseMetaDataUsingInfoSchemaDatabaseMetaData是的子类,看名称就能联想到是通过 INFORMATION_SCHEMA 数据库获取数据库的metadata,可以正确返回table_comment字段。

下面是useInformationSchema的官方说明

useInformationSchema When connected to MySQL-5.0.7 or newer, should the driver use the INFORMATION_SCHEMA to derive information used by DatabaseMetaData? Default: false Since version: 5.0.0 摘自《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

而父类DatabaseMetaData并不一定能正常返回table_comment字段.

关于INFORMATION_SCHEMA 这里不深入探讨,参见《Chapter 24 INFORMATION_SCHEMA Tables》

解决方法

解决的方法也很简单: 数据库连接时设置useInformationSchema=true 如何设置数据库连接参数呢?有两个途径

方法一:java代码实现

# 将所有参数装入java.util.Properties 对象
Properties props = new Properties();
props.setProperty("username",this.username);
props.setProperty("password",this.password); 
props.setProperty("useInformationSchema", "true");
# 调用getConnection(String,Properties)方法创建连接
this.pConnection = java.sql.DriverManager.getConnection(this.url, props);

方法二:连接url参数

直接将参数加到数据库连接url,如下代码中在数据连接url中添加了两个参数characterEncoding=utf8useInformationSchema=true

String url="jdbc:mysql://localhost:3306/test?characterEncoding=utf8&&useInformationSchema=true"
this.pConnection = DriverManager.getConnection(this.url, this.username,this.password);

关于mysql 连接URL的语法参见: 《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

参考资料

《Connector/J does not retrieve the table comment in a InnoDB table》 《Retrieve mysql table comment using DatabaseMetaData》 《Chapter 24 INFORMATION_SCHEMA Tables》 《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏行者常至

013.反射reflection

511
来自专栏你不就像风一样

从一个例子入门Mysql储存过程

864
来自专栏cloudskyme

结构体存入文件并且取出

首先定义结构体 struct student_type { char name[10]; int num; int age; } stu...

2916
来自专栏码农二狗

阻塞channel优先返回给主线程

1026
来自专栏.NET开发那点事

关于Form.Close跟Form.Dispose

我们在Winform开发的时候,使用From.Show来显示窗口,使用Form.Close来关闭窗口。熟悉Winform开发的想必对这些非常熟悉。但是Form类...

1856
来自专栏专注研发

单例模式三种模式,饿汉(饥汉)、饱汉(懒汉)、双重锁模式

今天看某培训机构提供面试题中设计模式部分,对饱汉和饿汉比较感兴趣,就搜了一下,然后误人子弟,然后就觉得有必要记录一下

671
来自专栏Golang语言社区

【Go 语言社区】各种变量的声明

a:=10; b:="Hello World"; fmt.Printf("%d\n",a); fmt.Printf("%s\n",b); var( c int...

31510
来自专栏Golang语言社区

Golang语言--将byte的int转换

在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决 所以,需要 :impor...

3698
来自专栏禹都一只猫博客

Go语言简介 — 特性

721
来自专栏Golang语言社区

golang的HTTP基本认证机制实例详解

本文实例讲述了golang的HTTP基本认证机制。分享给大家供大家参考,具体如下: 看了<<http权威指南>>第12章HTTP基本认证机制(本站下载地址:ht...

3316

扫码关注云+社区