前言:
JAVA在平时连接关系型数据库的时候,一般都是使用JDBC的方式连接的,但是怎么获取到库表结构你真的懂了吗?
JDBC是什么?
JDBC全称叫Java DataBase Connectivity),可以理解为是一种执行SQL语句的JAVA API。主要用来对常用的数据库系统连接交互。
API主要由以下组成
- Drive——驱动程序(用来连接什么数据库)
- Connection——数据库连接对象
- Statement——陈述(SQL做什么)
- ResultSet——结果集(执行SQL的结果)
获取数据库元数据:
数据库元数据DatabaseMetaData是数据库的基础组成数据:例如:mysql一个数据库是由catalog(schema)=> table(表) => column(字段)组成,所以可以从元数据获取到这些信息;
数据库结构:
数据库表结构:
user表结构如下:
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` bigint NOT NULL COMMENT '租户ID',
`name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
`operator_id` bigint NOT NULL COMMENT '操作人ID',
`create_time` timestamp NOT NULL COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_flag` int NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
USER_ADDR地址表结构如下
CREATE TABLE `USER_ADDR` (
`id` bigint NOT NULL COMMENT '主键ID',
`user_id` bigint NOT NULL COMMENT 'user.id',
`name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
示例代码:
public class MysqlTestMain {
private final static String url = "jdbc:mysql://localhost:3306/liang";
private final static String userName = "root";
private final static String password = "123456";
public static void main(String[] args) {
try (Connection con = DriverManager.getConnection(url, userName, password)) {
DatabaseMetaData databaseMetaData = con.getMetaData();
String catalog = con.getCatalog();
System.out.println("数据库catalog" + catalog);
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
ResultSet metaDataTables = databaseMetaData.getTables(catalog, null, null, null);
while (metaDataTables.next()) {
String tableName = metaDataTables.getString(3);
System.out.println(" + 表名: " + tableName);
System.out.println(" + 表备注: " + metaDataTables.getString(5));
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
ResultSet columns = databaseMetaData.getColumns(catalog, null, tableName, null);
while (columns.next()) {
String columnName = columns.getString(4);
System.out.println(" ++ 字段名" + columnName);
System.out.println(" ++ 数据类型" + StringUtils.toLowerCase(columns.getString(6)));
System.out.println(" ++ 字段备注 " + columns.getString(12));
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行结果:
数据库catalogliang
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ 表名: USER_ADDR
+ 表备注:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名id
++ 数据类型bigint
++ 字段备注 主键ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名user_id
++ 数据类型bigint
++ 字段备注 user.id
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名name
++ 数据类型varchar
++ 字段备注 地址名称
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ 表名: user
+ 表备注:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名id
++ 数据类型bigint
++ 字段备注 主键ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名tenant_id
++ 数据类型bigint
++ 字段备注 租户ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名name
++ 数据类型varchar
++ 字段备注 姓名
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名operator_id
++ 数据类型bigint
++ 字段备注 操作人ID
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名create_time
++ 数据类型timestamp
++ 字段备注 创建时间
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名update_time
++ 数据类型timestamp
++ 字段备注 更新时间
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ 字段名delete_flag
++ 数据类型int
++ 字段备注 是否删除
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
获取元数据成功
分析源码:
提示:JDBC获取元数据只是JDBC实现针对不同数据库厂商实现的不同方法:其实就是执行SQL获取元数据
在上文示例中,JDBC连接MYSQL通过information_schema数据库下的schema、table、column表存储了所有的库表字段信息。MYSQL特别的是认为catalog和schema是等价的
获取数据库目录
SHOW schemas;
获取表分析
SHOW tables;
获取字段信息
SHOW columns;
总结
不同数据库对应的JDBC实现也不一样,获取元数据的实现也不一样,最好是分析一下执行的SQL是否能满足自己需求再决定使用。如有不对。欢迎指正。