所谓的元信息,就是数据库实例有多少数据库,数据库有多少张表,每张表什么字段等等信息.
连接数据库实例
通常情况下,我们都是连接具体的数据库,但有些时候(比如ETL配置过程中,查询数据库实例里,有多少数据库),我们需要
连接数据库实例,不指定具体的数据库名称,连接的jdbc字符串为 jdbc:mysql://host:port,当然这种连接是支持查询数据库的,需要带上数据库,e.g. select * from dbname.table
statement 种类及区别
我们可以通过类似如下代码,连接数据库
String url = "jdbc:mysql://localhost:3306/demo";
Connection conn = DriverManager.getConnection(url, "root", "");
然后通过conn.createStatement(), conn.prepareStatement(...),conn.prepareCall(...) 获取Statement,然后在执行对应的SQL,获取的Statements, PreparedStatement, CallableStatement 有什么区别?
| Class | 功能 | 特点 |
|---|---|---|
| Statement | 用于执行静态的SQL,即SQL中不接收参数 | 执行过程中,编译SQL;不可以在SQL中使用?设置值;不可以用于读写二进制数据(例如图片) |
| PreparedStatement | 执行预编译的SQL,在执行过程中,可以接收参数 | 比 Statement 执行快,因为只需编译一次,可以多次执行;可以使用 ? 符号替换需要的值;可用于读取二进制值;可阻止SQL注入攻击,因为特殊字符会被转义
|
| CallableStatment | 执行数据库中的存储过程 |
数据库元信息
通过数据库连接,可以获取数据库的信息
DatabaseMetaData md = conn.getMetaData();
DatabaseMetaData有如下方法可以使用:
-
属性相关
- 数据库名称
getDatabaseProductName() - 数据版本
getDatabaseProductVersion - 数据库是否处于只读状态
isReadOnly() - 数据库使用的关键字(转义使用)
getSQLKeywords() - 数据库里面的函数(智能提醒时,使用),包括数值函数,字符串,系统,时间函数
get...Functions()
-数据库允许的最xx值,比如列名最大长度,getMax...Length() - null 值排序是否在最高位
nullsAreSortedHigh(),nullsAreSortedLow(),nullsAreSortedAtEnd
- 数据库名称
-
与数据库/数据表/相关项,返回
ResultSet,可根据文档解析获取值- 获取 catelog(数据库名称)
getCatalogs() - 查询schema
getSchemas(),getSchemas(catalog, schemapattern) - 查询表
getTables(...) - 查询列
getColumns(...) - 查询主键
getPrimaryKeys(...) - 查询索引信息
getIndexInfo(...) - 查询表权限
getTablePrivileges(...) - 查询列权限
getColumnPrivileges(...)
- 获取 catelog(数据库名称)