数据库之元数据

14 篇文章 1 订阅

目录

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

      <!--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"});
            //拼装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 获取指定数据库表中的字段属性

@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语句中占位符参数的个数

@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中的类型(包名加类名)

@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();
        }
    }

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
达梦数据库的数据目录是指存储数据库实例数据的文件夹。在达梦数据库中,数据目录包含了数据库的各种文件,如表空间文件、日志文件、索引文件等。数据目录的结构和内容对于数据库的正常运行和数据的安全性非常重要。 一般情况下,达梦数据库的数据目录包括以下几个主要文件夹: 1. 数据库实例目录:该目录是数据库实例的根目录,通常以实例名命名。在该目录下,可以找到与该实例相关的各种配置文件和日志文件。 2. 表空间目录:表空间是数据库中存储数据的逻辑结构,每个表空间对应一个或多个数据文件。表空间目录存储了这些数据文件,以及与表空间相关的其他文件,如索引文件、临时文件等。 3. 日志目录:日志是数据库中记录事务操作的重要组成部分,包括事务日志和归档日志。日志目录存储了这些日志文件,用于数据库的恢复和故障恢复。 4. 系统目录:系统目录包含了数据库系统相关的文件,如系统表空间、系统索引等。这些文件对于数据库的正常运行和管理非常重要。 5. 其他目录:除了上述主要目录外,还可能存在其他一些目录,如备份目录、临时文件目录等。这些目录用于数据库的备份和恢复、临时数据的存储等。 总的来说,达梦数据库的数据目录是数据库实例的核心组成部分,包含了数据库的各种文件和数据结构。正确管理和维护数据目录对于数据库的正常运行和数据的安全性至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我阿杰好了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值