前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库之元数据

数据库之元数据

作者头像
叫我阿杰好了
发布2022-11-07 14:41:51
8780
发布2022-11-07 14:41:51
举报
文章被收录于专栏:一切总会归于平淡

目录

1、数据库中的元数据

1.1 什么是数据库元数据

1.2 数据库元数据的作用

1.3 如何获取元数据

2、 数据库元数据

2.1 构建环境

2.2 获取数据库综合信息

2.3 获取数据库列表

2.4 获取某数据库中的所有表信息

2.5 获取指定数据库表中的字段属性

3、参数元数据

3.1 获取预编译SQL语句中占位符参数的个数

4、 结果集元数据


1、数据库中的元数据

1.1 什么是数据库元数据

元数据(MetaData),是指定义数据结构的数据。

例如这张表的表头(列名)

当然还有数据库名和表名。

除了这些还有用户名、版本名以及从SQL语句得到的结果中的大部分字符串都是元数据。

1.2 数据库元数据的作用

那数据库中的元数据有什么作用呢?

主要有两个方面:

  • 应用设计方面,例如代码生成器,它里面就需要用到数据库元数据。
  • 如果你了解了数据库元数据,就能对数据库的一些框架有更深层次的了解,例如 jpa,Mybatis。

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 依赖。

代码语言:javascript
复制
      <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

既然是SpringBoot项目,那当然是直接使用 yml文件 配置数据库连接啦。

代码语言:javascript
复制
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 获取数据库综合信息

代码语言:javascript
复制
@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 获取数据库列表

代码语言:javascript
复制
@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 获取某数据库中的所有表信息

代码语言:javascript
复制
@Test
    void Test01() {
        try {
            //获取数据库元数据
            DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
            // 获取指定数据库中指定的表信息
            ResultSet tablers = dbMetaData.getTables(null, null, "t_user", new String[]{"TABLE"});
            //拼装table
            while (tablers.next()) {
                //所属数据库 1 || TABLE_CAT
                System.out.println("所属数据库:" + tablers.getString("TABLE_CAT"));
                //表模式 2 || TABLE_SCHEM
                System.out.println("表模式:" + tablers.getString("TABLE_SCHEM"));
                //表名 3 || TABLE_NAME
                System.out.println("表名:" + tablers.getString("TABLE_NAME"));
                //数据库表类型 4 || TABLE_TYPE
                System.out.println("类型:" + tablers.getString("TABLE_TYPE"));
                //数据库表备注 5 || REMARKS
                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 获取指定数据库表中的字段属性

代码语言:javascript
复制
@Test
    void Test01() {
        try {
            //获取数据库元数据
            DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
            // 获取指定数据库表中的字段信息
            ResultSet columns = dbMetaData.getColumns("mybatis_plus", null, "t_user", null);
            //拼装table
            while (columns.next()) {
                //所属数据库 1 || TABLE_CAT
                System.out.println("所属数据库:" + columns.getString("TABLE_CAT"));
                //表模式 2 || TABLE_SCHEM
                System.out.println("表模式:" + columns.getString("TABLE_SCHEM"));
                //表名 3 || TABLE_NAME
                System.out.println("表名:" + columns.getString("TABLE_NAME"));
                // 列名 4 || COLUMN_NAME
                System.out.println("列名:" + columns.getString("COLUMN_NAME"));
                //数据库表类型 5 || DATA_TYPE
                System.out.println("类型:" + columns.getString("DATA_TYPE"));
                //数据库表备注 12 || REMARKS
                System.out.println("备注:" + columns.getString("REMARKS"));
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
    }

这个没什么改变,就换了个方法 getColumns

参数一样的就是最后一个变成 列名,null就代表查找所有列。

3、参数元数据

参数元数据(ParameterMetaData):是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等。

3.1 获取预编译SQL语句中占位符参数的个数

代码语言:javascript
复制
@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中的类型(包名加类名)

代码语言:javascript
复制
@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");
            //执行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();
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、数据库中的元数据
    • 1.1 什么是数据库元数据
      • 1.2 数据库元数据的作用
        • 1.3 如何获取元数据
        • 2、 数据库元数据
          • 2.1 构建环境
            • 2.2 获取数据库综合信息
              • 2.3 获取数据库列表
                • 2.4 获取某数据库中的所有表信息
                  • 2.5 获取指定数据库表中的字段属性
                    • 3.1 获取预编译SQL语句中占位符参数的个数
                • 3、参数元数据
                • 4、 结果集元数据
                相关产品与服务
                云数据库 SQL Server
                腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档