DatabaseMetaData
DatabaseMetaData记录了元数据信息,下面将记录获取的方法
DBConnUtil 连接工具
public class DBConnUtil {
public static final String MYSQL_DRI = "com.mysql.jdbc.Driver";
public static Connection getDbConnection(String jdbcURL, String userName, String password) throws Exception{
Connection conn =null;
Class.forName(MYSQL_DRI);
try {
conn = DriverManager.getConnection(jdbcURL, userName, password);
}catch(Exception e) {
throw new Exception(e);
}
return conn;
}
public static void closeConn(Connection conn)throws Exception{
if(conn!=null) {
conn.close();
}
}
}
查询表的表头信息
public static void main(String[] args) {
String url ="jdbc:mysql://dev-vm-00:3306/poc?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user="test";
String pwd = "test";
try (Connection conn = DBConnUtil.getDbConnection(url, user, pwd)) {
System.out.println("==============start==========");
DatabaseMetaData metaData1 = conn.getMetaData();
ResultSet rs =null;
//catalog 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 "" 表 示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
//schemaPattern 数据库名,对于oracle来说就用户名
//tableNamePattern 表名称模式;它必须与存储在数据库中的表名称匹配,支持模糊查询,%和_连个占位符,和在数据库中占位符意义一样
//types 表的类型(TABLE | VIEW)
rs = metaData1.getTables(null, null, "%", new String[]{"TABLE"});
//结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1 ; i <= rsmd.getColumnCount(); i++ ){
String column = rsmd.getColumnName(i);
System.out.println(column);
}
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
结果输出:
TABLE_CAT String
TABLE_SCHEM String
TABLE_NAME String
TABLE_TYPE String
REMARKS String
稍微解释一下这几个是什么意思:
TABLE_CAT String => 表类别–数据库名称
TABLE_SCHEM String => 表模式
TABLE_NAME String => 表名称
TABLE_TYPE String => 表类型
REMARKS String => 表备注
查询表信息
public static void main(String[] args) {
String url ="jdbc:mysql://dev-vm-00:3306/poc?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user="test";
String pwd = "test";
try (Connection conn = DBConnUtil.getDbConnection(url, user, pwd)) {
System.out.println("==============start==========");
DatabaseMetaData metaData1 = conn.getMetaData();
ResultSet rs =null;
//catalog 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 "" 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
//schemaPattern 数据库名,对于oracle来说就用户名
//tableNamePattern 表名称模式;它必须与存储在数据库中的表名称匹配,支持模糊查询,%和_连个占位符,和在数据库中占位符意义一样
//types 表的类型(TABLE | VIEW)
rs = metaData1.getTables(null, null, "%", new String[]{"TABLE"});
//结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1 ; i <= rsmd.getColumnCount(); i++ ){
String column = rsmd.getColumnName(i);
System.out.println(column);
}
//输出了TABLE_CAT String => 表类别-数据库名称
//TABLE_SCHEM String => 表模式
//TABLE_NAME String => 表名称
//TABLE_TYPE String => 表类型
//REMARKS String => 表备注
while (rs.next()){
//根据元数据表头找到想要的数据 如下想要表名就
String table_name = rs.getString("TABLE_NAME");
System.out.println("表名:"+table_name);
}
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
查看列表头信息
public static void main(String[] args) {
String url ="jdbc:mysql://dev-vm-00:3306/poc?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user="test";
String pwd = "test";
try (Connection conn = DBConnUtil.getDbConnection(url, user, pwd)) {
System.out.println("==============start==========");
DatabaseMetaData metaData1 = conn.getMetaData();
ResultSet rs =null;
// 得到全部列名
// String catalog 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 "" 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
// String schemaPattern 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 "" 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
// String tableNamePattern 表名称模式;它必须与存储在数据库中的表名称匹配
// String columnNamePattern 列名称模式;它必须与存储在数据库中的列名称匹配
// 每一行都是一个列描述
rs = conn.getMetaData().getColumns(null, null, "%","%");
//结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1 ; i <= rsmd.getColumnCount(); i++ ){
String column = rsmd.getColumnName(i);
System.out.println(column);
}
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
输出:
TABLE_CAT
TABLE_SCHEM
TABLE_NAME
COLUMN_NAME
DATA_TYPE
TYPE_NAME
COLUMN_SIZE
BUFFER_LENGTH
DECIMAL_DIGITS
NUM_PREC_RADIX
NULLABLE
REMARKS
COLUMN_DEF
SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
ORDINAL_POSITION
IS_NULLABLE
SCOPE_CATALOG
SCOPE_SCHEMA
SCOPE_TABLE
SOURCE_DATA_TYPE
IS_AUTOINCREMENT
表头解释:
TABLE_CAT:表类别(可能为空)
TABLE_SCHEM:表模式(可能为空)
TABLE_NAME:表名
COLUMN_NAME:列名
DATA_TYPE:对应的java.sql.Types的SQL类型(列类型ID)
TYPE_NAME:java.sql.Types类型名称(列类型名称)
COLUMN_SIZE:列大小
BUFFER_LENGTH:缓冲长度(有待验证)
DECIMAL_DIGITS:小数位数
NUM_PREC_RADIX:/基数(通常是10或2,有待验证)
NULLABLE:是否允许为null
REMARKS:列描述
COLUMN_DEF:默认值
SQL_DATA_TYPE:SQL数据类型(有待验证)
SQL_DATETIME_SUB:SQL时间间隔(有待验证)
CHAR_OCTET_LENGTH:对于 char 类型,该长度是列中的最大字节数
ORDINAL_POSITION:表中列的索引(从1开始)
IS_NULLABLE:是否允许为null,0为不允许为空,1为允许为空,2为不确定
查询列信息
public static void main(String[] args) {
String url ="jdbc:mysql://dev-vm-00:3306/poc?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user="test";
String pwd = "test";
try (Connection conn = DBConnUtil.getDbConnection(url, user, pwd)) {
System.out.println("==============start==========");
DatabaseMetaData metaData1 = conn.getMetaData();
ResultSet rs =null;
// 得到全部列名
// String catalog 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 "" 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
// String schemaPattern 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 "" 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
// String tableNamePattern 表名称模式;它必须与存储在数据库中的表名称匹配
// String columnNamePattern 列名称模式;它必须与存储在数据库中的列名称匹配
// 每一行都是一个列描述
rs = conn.getMetaData().getColumns(null, null, "%","%");
//结果集的元数据(不需要可以忽略)
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1 ; i <= rsmd.getColumnCount(); i++ ){
String column = rsmd.getColumnName(i);
System.out.println(column);
}
//可查看上面输出的表头解释
while (rs.next()){
String table_name = rs.getString("TABLE_NAME");
String column_name = rs.getString("COLUMN_NAME");
System.out.println("表名:"+table_name+"=>列名:"+column_name);
}
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
查询sql也可以获取到表头
public static void main(String[] args) {
String url ="jdbc:mysql://dev-vm-00:3306/poc?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user="test";
String pwd = "test";
try (Connection conn = DBConnUtil.getDbConnection(url, user, pwd)) {
System.out.println("==============start==========");
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(" select * from ind_relation ");
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i=1;i<=columnCount;i++){
String catalogName = metaData.getColumnName(i);
metaData.getTableName(i);
String catalogName1 = metaData.getCatalogName(i);
System.out.println("catalogName1:"+catalogName1);
String columnTypeName = metaData.getColumnTypeName(i);
System.out.println("数据类型"+columnTypeName);
System.out.println(catalogName);
}
}catch (Exception e){
e.printStackTrace();
}
}