所谓的元信息,就是数据库实例有多少数据库,数据库有多少张表,每张表什么字段等等信息.
连接数据库实例
通常情况下,我们都是连接具体的数据库,但有些时候(比如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(数据库名称)
网友评论