1.3 如何获取元数据
我们在JAVA中操作数据库,无非就是JDBC,不管是MySQL还是Oracle 或者是其他数据库,基本都是通过JDBC的连接去跟数据库打交道。
使用JDBC来处理数据库的接口主要有三个,即Connection,PreparedStatement和ResultSet这三个接口。
对于这三个接口,还可以获取不同类型的元数据。
接口
|
说明
|
Connection
|
获取数据库元数据(DatabaseMetaData)
|
PreparedStatement
|
获取我们发送请求获得的参数元数据(ParameterMetaData)
|
ResultSet
|
获取结果集元数据(ResultSetMetaData)
|
下面将对这三种类型的元数据对象进行各自的介绍并通过使用
MYSQL
数据库进行案例说明。
2、 数据库元数据
数据库元数据(DatabaseMetaData):是由Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的名称,数据库的版本号,数据库的URL,是否支持事务等等。
以下有一些关于DatabaseMetaData的常用方法:
方法
|
说明
|
getDatabaseProductName
|
获取数据库的名称
|
getDatabaseProductName
|
获取数据库的版本号
|
getUserName
|
获取数据库的用户名
|
getURL
|
获取数据库连接的URL
|
getDriverName
|
获取数据库的驱动名称
|
driverVersion
|
获取数据库的驱动版本号
|
isReadOnly
|
查看数据库是否只允许读操作
|
supportsTransactions
|
查看数据库是否支持事务
|
2.1 构建环境
我随便找的一个以前做Demo 的 项目(SpringBoot项目)去写了。
引入的mySql 依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
既然是SpringBoot项目,那当然是直接使用 yml文件 配置数据库连接啦。
server:
port: 80
spring:
application:
name: mp
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
2.2 获取数据库综合信息
@SpringBootTest
class MetadataTest {
@Resource
DataSource dataSourcee;
@Test
void Test01() {
try {
DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
String productName = dbMetaData.getDatabaseProductName();
System.out.println("数据库产品名称:" + productName);
String productVersion = dbMetaData.getDatabaseProductVersion();
System.out.println("数据库版本号:"+productVersion);
String userName = dbMetaData.getUserName();
System.out.println("数据库用户名:"+userName);
} catch (Exception throwables) {
throwables.printStackTrace();
这里就写了三个哈,反正都大同小异,剩下的大家自己去尝试。
2.3 获取数据库列表
@SpringBootTest
class MetadataTest {
@Resource
DataSource dataSourcee;
@Test
void Test01() {
try {
DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
ResultSet rs = dbMetaData.getCatalogs();
while (rs.next()) {
System.out.println("表名:"+rs.getString(1));
rs.close();
dataSourcee.getConnection().close();
} catch (Exception throwables) {
throwables.printStackTrace();
2.4 获取某数据库中的所有表信息
@Test
void Test01() {
try {
DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
ResultSet tablers = dbMetaData.getTables(null, null, "t_user", new String[]{"TABLE"});
while (tablers.next()) {
System.out.println("所属数据库:" + tablers.getString("TABLE_CAT"));
System.out.println("表模式:" + tablers.getString("TABLE_SCHEM"));
System.out.println("表名:" + tablers.getString("TABLE_NAME"));
System.out.println("类型:" + tablers.getString("TABLE_TYPE"));
System.out.println("备注:" + tablers.getString("REMARKS"));
} catch (Exception throwables) {
throwables.printStackTrace();
其中获取表数据的方法 getTables 中的4个参数分别是:
参数 | 说明 |
---|
catalog | 数据库名称,null 就是所有数据库 |
schemaPattern | 模式名称,在mysql中没什么特别意义,所以直接填 null . |
tableNamePattern | 表名,null 就是所有表 |
types[] | 类型: TABLE:表 VIEW:视图 |
看看执行效果吧:
2.5 获取指定数据库表中的字段属性
@Test
void Test01() {
try {
DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
ResultSet columns = dbMetaData.getColumns("mybatis_plus", null, "t_user", null);
while (columns.next()) {
System.out.println("所属数据库:" + columns.getString("TABLE_CAT"));
System.out.println("表模式:" + columns.getString("TABLE_SCHEM"));
System.out.println("表名:" + columns.getString("TABLE_NAME"));
System.out.println("列名:" + columns.getString("COLUMN_NAME"));
System.out.println("类型:" + columns.getString("DATA_TYPE"));
System.out.println("备注:" + columns.getString("REMARKS"));
} catch (Exception throwables) {
throwables.printStackTrace();
这个没什么改变,就换了个方法 getColumns
参数一样的就是最后一个变成 列名,null就代表查找所有列。
3、参数元数据
参数元数据(ParameterMetaData):是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等。
3.1 获取预编译SQL语句中占位符参数的个数
@Test
void Test01() {
try {
String sql = "select * from t_user where uid = ?"
PreparedStatement pstmt = dataSourcee.getConnection().prepareStatement(sql)
//获取ParameterMetaData对象
ParameterMetaData paramMetaData = pstmt.getParameterMetaData()
pstmt.setString(1, "1")
//获取参数个数
int paramCount = paramMetaData.getParameterCount()
System.out.println(paramCount)
} catch (Exception throwables) {
throwables.printStackTrace()
当然它还有很多其它的方法。这个对刚学JDBC连接数据库的同学应该很熟悉,反正我是忘得差不多了。
4、 结果集元数据
结果集元数据(ResultSetMetaData):是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据 库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。
常用方法有:
方法 | 说明 |
---|
getColumnCount | 获取结果集中列项目的个数 |
getColumnType | 获取指定列的SQL类型对应于Java中Types类的字段 |
getColumnTypeName | 获取指定列的SQL类型 |
getClassName | 获取指定列SQL类型对应于Java中的类型(包名加类名) |
void Test01() {
try {
String sql = "select * from t_user where uid = ?";
PreparedStatement pstmt = dataSourcee.getConnection().prepareStatement(sql);
//获取ParameterMetaData对象
ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
pstmt.setString(1, "1");
//执行sql语句
ResultSet rs = pstmt.executeQuery();
//获取ResultSetMetaData对象
ResultSetMetaData metaData = rs.getMetaData();
//获取查询字段数量
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
//获取列名称
String columnName = metaData.getColumnName(i);
//获取java类型
String columnClassName = metaData.getColumnClassName(i);
//获取sql类型
String columnTypeName = metaData.getColumnTypeName(i);
System.out.println("列名称"+columnName);
System.out.println("java类型"+columnClassName);
System.out.println("sql类型"+columnTypeName);
System.out.println(columnCount);
} catch (Exception throwables) {
throwables.printStackTrace();
复制代码
- 347
-
一切总会归于平淡
Spring Cloud