天天看點

|NO.Z.00108|——————————|BigDataEnd|——|Java&MySQL.資料庫連接配接池和DBUtils.V17|——|MySQL.v18|mysql中繼資料|

一、MySql中繼資料

### --- MySql中繼資料

~~~     [mysql中繼資料介紹&相關指令]——[JDBC擷取中繼資料常用類介紹]
~~~     [JDBC擷取資料庫中繼資料資訊]——[JDBC擷取結果集中繼資料資訊]           
### --- 什麼是中繼資料

~~~     # 除了表之外的資料都是中繼資料,可以分為三類
——>        查詢結果資訊: UPDATE 或 DELETE語句 受影響的記錄數。
——>        資料庫和資料表的資訊: 包含了資料庫及資料表的結構資訊。
——>        MySQL伺服器資訊: 包含了資料庫伺服器的目前狀态,版本号等。           
### --- 常用指令

-- 中繼資料相關的指令介紹
-- 1.檢視伺服器目前狀态
-- 2.檢視MySQl的版本資訊
-- 3.查詢表中的詳細資訊
-- 4.顯示資料表的詳細索引資訊
-- 5.列出所有資料庫
-- 6.顯示目前資料庫的所有表
-- 7.擷取目前的資料庫名           
~~~     select version(); 擷取mysql伺服器的版本資訊
~~~     show status; 檢視伺服器的狀态資訊
~~~     show columns from table_name; 顯示表的字段資訊等,和desc table_name一樣
~~~     show index from table_name; 顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)
——>        show databases:列出所有資料庫
——>        show tables : 顯示目前資料庫的所有表
——>        select database(): 擷取目前的資料庫名           
|NO.Z.00108|——————————|BigDataEnd|——|Java&MySQL.資料庫連接配接池和DBUtils.V17|——|MySQL.v18|mysql中繼資料|
|NO.Z.00108|——————————|BigDataEnd|——|Java&MySQL.資料庫連接配接池和DBUtils.V17|——|MySQL.v18|mysql中繼資料|
|NO.Z.00108|——————————|BigDataEnd|——|Java&MySQL.資料庫連接配接池和DBUtils.V17|——|MySQL.v18|mysql中繼資料|
|NO.Z.00108|——————————|BigDataEnd|——|Java&MySQL.資料庫連接配接池和DBUtils.V17|——|MySQL.v18|mysql中繼資料|

二、使用JDBC 擷取中繼資料

### --- 使用JDBC 擷取中繼資料

——>        通過JDBC 也可以擷取到中繼資料,比如資料庫的相關資訊,
——>        或者當我們使用程式查詢一個不熟悉的表時, 我們可以通過擷取元素據資訊,
——>        了解表中有多少個字段,字段的名稱 和 字段的類型           
### --- 常用類介紹

~~~     # JDBC中描述中繼資料的類
~~~     # 擷取中繼資料對象的方法 : getMetaData ()
——>        connection 連接配接對象, 調用 getMetaData () 方法,擷取的是DatabaseMetaData 資料庫中繼資料對象
——>        PrepareStatement 預處理對象調用 getMetaData () , 擷取的是ResultSetMetaData , 結果集中繼資料對象
——>        DatabaseMetaData的常用方法           
中繼資料類 作用
DatabaseMetaData  描述資料庫的中繼資料對象
ResultSetMetaData  描述結果集的中繼資料對象
方法說明
getURL() : 擷取資料庫的URL
getUserName(): 擷取目前資料庫的使用者名
getDatabaseProductName(): 擷取資料庫的産品名稱
getDatabaseProductVersion(): 擷取資料的版本号
getDriverName(): 傳回驅動程式的名稱
isReadOnly(): 判斷資料庫是否隻允許隻讀 true 代表隻讀
方法說明:ResultSetMetaData的常用方法
getColumnCount() : 目前結果集共有多少列
getColumnName(int i) : 擷取指定列号的列名, 參數是整數 從1開始
getColumnTypeName(int i): 擷取指定列号列的類型, 參數是整數 從1開始

三、代碼示例

public class TestMetaData {
    //1.擷取資料庫相關的中繼資料資訊 使用DatabaseMetaData
    @Test
    public void testDataBaseMetaData() throws SQLException {

        //1.擷取資料庫連接配接對象 connection
        Connection connection = DruidUtils.getConnection();

        //2.擷取代表資料庫的 中繼資料對象 DatabaseMetaData
        DatabaseMetaData metaData = connection.getMetaData();

        //3.擷取資料庫相關的中繼資料資訊
        String url = metaData.getURL();
        System.out.println("資料庫URL: " + url);
        String userName = metaData.getUserName();
        System.out.println("目前使用者: " + userName );
        String productName = metaData.getDatabaseProductName();
        System.out.println("資料庫産品名: " + productName);
        String version = metaData.getDatabaseProductVersion();
        System.out.println("資料庫版本: " + version);
        String driverName = metaData.getDriverName();
        System.out.println("驅動名稱: " + driverName);

        //判斷目前資料庫是否隻允許隻讀
        boolean b = metaData.isReadOnly(); //如果是 true 就表示 隻讀
        if(b){
        System.out.println("目前資料庫隻允許讀操作!");
        }else{
        System.out.println("不是隻讀資料庫");
        }
        connection.close();
    }
    //擷取結果集中的中繼資料資訊
    @Test
    public void testResultSetMetaData() throws SQLException {

        //1.擷取連接配接
        Connection con = DruidUtils.getConnection();

        //2.擷取預處理對象
        PreparedStatement ps = con.prepareStatement("select * from employee");
        ResultSet resultSet = ps.executeQuery();

        //3.擷取結果集元素據對象
        ResultSetMetaData metaData = ps.getMetaData();

        //1.擷取目前結果集 共有多少列
        int count = metaData.getColumnCount();
        System.out.println("目前結果集中共有: " + count + " 列");

        //2.獲結果集中 列的名稱 和 類型
        for (int i = 1; i <= count; i++) {
        String columnName = metaData.getColumnName(i);
        System.out.println("列名: "+ columnName);
        String columnTypeName = metaData.getColumnTypeName(i);
        System.out.println("類型: " +columnTypeName);
        }

        //釋放資源
        DruidUtils.close(con,ps,resultSet);
    }
}           

四、sql語句

package com.yanqi.testmetadata;

        import com.yanqi.utils.DruidUtils;
        import org.junit.Test;

        import java.sql.*;

public class TestMetaData {

    //1.擷取資料庫相關的中繼資料資訊 使用DatabaseMetaData
    @Test
    public void testDataBaseMetaData() throws SQLException {

        //1.擷取資料庫連接配接對象 connection
        Connection connection = DruidUtils.getConnection();

        //2.擷取代表資料庫的 中繼資料對象 DatabaseMetaData
        DatabaseMetaData metaData = connection.getMetaData();

        //3.擷取資料庫相關的中繼資料資訊
        String url = metaData.getURL();
        System.out.println("資料庫URL: " + url);

        String userName = metaData.getUserName();
        System.out.println("目前使用者: " + userName );

        String productName = metaData.getDatabaseProductName();
        System.out.println("資料庫産品名: " + productName);

        String version = metaData.getDatabaseProductVersion();
        System.out.println("資料庫版本: " + version);

        String driverName = metaData.getDriverName();
        System.out.println("驅動名稱: " + driverName);

        //判斷目前資料庫是否隻允許隻讀
        boolean b = metaData.isReadOnly();  //如果是 true 就表示 隻讀
        if(b){
            System.out.println("目前資料庫隻允許讀操作!");
        }else{
            System.out.println("不是隻讀資料庫");
        }

        connection.close();
    }

    //擷取結果集中的中繼資料資訊
    @Test
    public void testResultSetMetaData() throws SQLException {

        //1.擷取連接配接
        Connection con = DruidUtils.getConnection();

        //2.擷取預處理對象
        PreparedStatement ps = con.prepareStatement("select * from employee");
        ResultSet resultSet = ps.executeQuery();

        //3.擷取結果集元素據對象
        ResultSetMetaData metaData = ps.getMetaData();

        //1.擷取目前結果集 共有多少列
        int count = metaData.getColumnCount();
        System.out.println("目前結果集中共有: " + count + " 列");

        //2.獲結果集中 列的名稱 和 類型
        for (int i = 1; i <=  count; i++) {
            String columnName = metaData.getColumnName(i);
            System.out.println("列名: "+ columnName);

            String columnTypeName = metaData.getColumnTypeName(i);
            System.out.println("類型: " +columnTypeName);
        }

        //釋放資源
        DruidUtils.close(con,ps,resultSet);
    }

}           

五、列印輸出

D:\JAVA\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=62503:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;E:\NO.Z.10000——javaproject\NO.H.00002.mysql\mysql\out\production\mysql.jdbc_task06;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\dom4j-1.6.1.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\druid-1.0.9.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\c3p0-0.9.5.2.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\commons-dbcp-1.4.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\jaxen-1.1-beta-6.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\commons-pool-1.5.6.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\commons-dbutils-1.6.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\mchange-commons-java-0.2.12.jar;F:\NO.Z.02000——soft——IT.實驗\20210801——Hadoop\20210801.2——Hadoop——第二階段——預科班\預科班第二階段子產品一\05 任務五 (JDBC)\03_軟體\myJar\mysql-connector-java-5.1.37-bin.jar;C:\Users\Administrator\.m2\repository\org\testng\testng\6.14.3\testng-6.14.3.jar;C:\Users\Administrator\.m2\repository\com\beust\jcommander\1.72\jcommander-1.72.jar;C:\Users\Administrator\.m2\repository\org\apache-extras\beanshell\bsh\2.0b6\bsh-2.0b6.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter\5.4.2\junit-jupiter-5.4.2.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.4.2\junit-jupiter-api-5.4.2.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.1.1\opentest4j-1.1.1.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.4.2\junit-platform-commons-1.4.2.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.4.2\junit-jupiter-params-5.4.2.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.4.2\junit-jupiter-engine-5.4.2.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.4.2\junit-platform-engine-1.4.2.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.yanqi.testmetadata.TestMetaData,testDataBaseMetaData
8月 05, 2021 10:44:52 下午 com.alibaba.druid.pool.DruidDataSource info
資訊: {dataSource-1} inited
資料庫URL: jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8
目前使用者: root@localhost
資料庫産品名: MySQL
資料庫版本: 5.7.28-log
驅動名稱: MySQL Connector Java
不是隻讀資料庫

Process finished with exit code 0           

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart

                                                                                                                                                   ——W.S.Landor