• 数据库之元数据


    目录

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

    1. <!--mysql-->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. <scope>runtime</scope>
    6. </dependency>

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

    1. server:
    2. port: 80
    3. spring:
    4. application:
    5. name: mp
    6. datasource: # 配置数据源信息
    7. url: jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    8. username: root
    9. password: 1234
    10. driver-class-name: com.mysql.cj.jdbc.Driver

    2.2 获取数据库综合信息

    1. @SpringBootTest
    2. class MetadataTest {
    3. // 数据源
    4. @Resource
    5. DataSource dataSourcee;
    6. @Test
    7. void Test01() {
    8. try {
    9. //获取数据库元数据
    10. DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
    11. //获取数据库产品名称
    12. String productName = dbMetaData.getDatabaseProductName();
    13. System.out.println("数据库产品名称:" + productName);
    14. // 获取数据库版本号
    15. String productVersion = dbMetaData.getDatabaseProductVersion();
    16. System.out.println("数据库版本号:"+productVersion);
    17. // 获取数据库用户名
    18. String userName = dbMetaData.getUserName();
    19. System.out.println("数据库用户名:"+userName);
    20. } catch (Exception throwables) {
    21. throwables.printStackTrace();
    22. }
    23. }
    24. }

    这里就写了三个哈,反正都大同小异,剩下的大家自己去尝试。
    效果:

    2.3 获取数据库列表

     

    1. @SpringBootTest
    2. class MetadataTest {
    3. // 数据源
    4. @Resource
    5. DataSource dataSourcee;
    6. @Test
    7. void Test01() {
    8. try {
    9. //获取数据库元数据
    10. DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
    11. //获取数据库列表
    12. ResultSet rs = dbMetaData.getCatalogs();
    13. //遍历获取所有数据库表
    14. while (rs.next()) {
    15. //打印数据库名称
    16. System.out.println("表名:"+rs.getString(1));
    17. }
    18. //释放资源
    19. rs.close();
    20. dataSourcee.getConnection().close();
    21. } catch (Exception throwables) {
    22. throwables.printStackTrace();
    23. }
    24. }

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

     

    1. @Test
    2. void Test01() {
    3. try {
    4. //获取数据库元数据
    5. DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
    6. // 获取指定数据库中指定的表信息
    7. ResultSet tablers = dbMetaData.getTables(null, null, "t_user", new String[]{"TABLE"});
    8. //拼装table
    9. while (tablers.next()) {
    10. //所属数据库 1 || TABLE_CAT
    11. System.out.println("所属数据库:" + tablers.getString("TABLE_CAT"));
    12. //表模式 2 || TABLE_SCHEM
    13. System.out.println("表模式:" + tablers.getString("TABLE_SCHEM"));
    14. //表名 3 || TABLE_NAME
    15. System.out.println("表名:" + tablers.getString("TABLE_NAME"));
    16. //数据库表类型 4 || TABLE_TYPE
    17. System.out.println("类型:" + tablers.getString("TABLE_TYPE"));
    18. //数据库表备注 5 || REMARKS
    19. System.out.println("备注:" + tablers.getString("REMARKS"));
    20. }
    21. } catch (Exception throwables) {
    22. throwables.printStackTrace();
    23. }
    24. }

    其中获取表数据的方法 getTables 中的4个参数分别是:

    参数

    说明

    catalog

    数据库名称,null 就是所有数据库

    schemaPattern

    模式名称,在mysql中没什么特别意义,所以直接填 null .

    tableNamePattern

    表名,null 就是所有表

    types[]

    类型: TABLE:表 VIEW:视图

    看看执行效果吧:

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

     

    1. @Test
    2. void Test01() {
    3. try {
    4. //获取数据库元数据
    5. DatabaseMetaData dbMetaData = dataSourcee.getConnection().getMetaData();
    6. // 获取指定数据库表中的字段信息
    7. ResultSet columns = dbMetaData.getColumns("mybatis_plus", null, "t_user", null);
    8. //拼装table
    9. while (columns.next()) {
    10. //所属数据库 1 || TABLE_CAT
    11. System.out.println("所属数据库:" + columns.getString("TABLE_CAT"));
    12. //表模式 2 || TABLE_SCHEM
    13. System.out.println("表模式:" + columns.getString("TABLE_SCHEM"));
    14. //表名 3 || TABLE_NAME
    15. System.out.println("表名:" + columns.getString("TABLE_NAME"));
    16. // 列名 4 || COLUMN_NAME
    17. System.out.println("列名:" + columns.getString("COLUMN_NAME"));
    18. //数据库表类型 5 || DATA_TYPE
    19. System.out.println("类型:" + columns.getString("DATA_TYPE"));
    20. //数据库表备注 12 || REMARKS
    21. System.out.println("备注:" + columns.getString("REMARKS"));
    22. }
    23. } catch (Exception throwables) {
    24. throwables.printStackTrace();
    25. }
    26. }

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

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

    3、参数元数据

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

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

    1. @Test
    2. void Test01() {
    3. try {
    4. String sql = "select * from t_user where uid = ?";
    5. PreparedStatement pstmt = dataSourcee.getConnection().prepareStatement(sql);
    6. //获取ParameterMetaData对象
    7. ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
    8. pstmt.setString(1, "1");
    9. //获取参数个数
    10. int paramCount = paramMetaData.getParameterCount();
    11. System.out.println(paramCount);
    12. } catch (Exception throwables) {
    13. throwables.printStackTrace();
    14. }
    15. }

    当然它还有很多其它的方法。这个对刚学JDBC连接数据库的同学应该很熟悉,反正我是忘得差不多了。

    4、 结果集元数据

    结果集元数据(ResultSetMetaData):是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据 库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。

    常用方法有:

    方法

    说明

    getColumnCount

    获取结果集中列项目的个数

    getColumnType

    获取指定列的SQL类型对应于Java中Types类的字段

    getColumnTypeName

    获取指定列的SQL类型

    getClassName

    获取指定列SQL类型对应于Java中的类型(包名加类名)

    1. @Test
    2. void Test01() {
    3. try {
    4. String sql = "select * from t_user where uid = ?";
    5. PreparedStatement pstmt = dataSourcee.getConnection().prepareStatement(sql);
    6. //获取ParameterMetaData对象
    7. ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
    8. pstmt.setString(1, "1");
    9. //执行sql语句
    10. ResultSet rs = pstmt.executeQuery();
    11. //获取ResultSetMetaData对象
    12. ResultSetMetaData metaData = rs.getMetaData();
    13. //获取查询字段数量
    14. int columnCount = metaData.getColumnCount();
    15. for (int i = 1; i <= columnCount; i++) {
    16. //获取列名称
    17. String columnName = metaData.getColumnName(i);
    18. //获取java类型
    19. String columnClassName = metaData.getColumnClassName(i);
    20. //获取sql类型
    21. String columnTypeName = metaData.getColumnTypeName(i);
    22. System.out.println("列名称"+columnName);
    23. System.out.println("java类型"+columnClassName);
    24. System.out.println("sql类型"+columnTypeName);
    25. }
    26. System.out.println(columnCount);
    27. } catch (Exception throwables) {
    28. throwables.printStackTrace();
    29. }
    30. }

     

  • 相关阅读:
    03、主动信息收集
    视频编辑SDK测试
    springboot 集成 docsify 实现随身文档
    大三学生HTML期末作业,网页制作作业——HTML+CSS+JavaScript饮品饮料茶(7页)
    你还在怕忘记网盘密码?商鼎云助记词登录保障你的安全
    生成代理:人类行为的交互模拟(Generative Agents: Interactive Simulacra of Human Behavior)
    微信小程序 java家庭个人收支理财记账本springboot
    【JavaSE】注释\标识符\关键字\字面常量\数据类型与变量
    Java WebSocket 获取客户端 IP 地址
    树莓派图像处理基础知识
  • 原文地址:https://blog.csdn.net/weixin_53041251/article/details/125476606