獲取數據庫中的元數據


  元數據(MetaData),是指定義數據結構的數據。那么數據庫元數據就是指定義數據庫各類對象結構的數據。 例
如數據庫中的數據庫名,表明, 列名、用戶名、版本名以及從SQL語句得到的結果中的大部分字符串是元數據
  使用JDBC來處理數據庫的接口主要有三個,即Connection,PreparedStatement和ResultSet這三個,
而對於這三個接口,還可以獲取不同類型的元數據,通過這些元數據類獲得一些數據庫的信息。
依賴
      <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

獲取數據庫中的元數據信息

package com.zhao.metadata;

import org.junit.Before;
import org.junit.Test;

import java.sql.*;
import java.util.Properties;

/**
 * 數據庫 元數據 練習
 */
public class metaDataTest {
    private Connection connection;

    @Before
    public void init() throws Exception {

        String driver ="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://127.0.0.1:3306/?useUnicode=true&characterEncoding=utf8";
        String username="root";
        String password="123456";

        Properties props = new Properties();
        props.put("remarksReporting","true");//獲取數據庫的備注信息
        props.put("user",username);
        props.put("password",password);

        //1.獲取連接
        Class.forName(driver);//注冊驅動
        connection = DriverManager.getConnection(url,props);
    }

    //獲取數據庫基本信息
    @Test
    public void test01() throws Exception {
        //2.獲取元數據
        DatabaseMetaData metaData = connection.getMetaData();

        //3.獲取數據庫基本信息
        System.out.println(metaData.getUserName());

        System.out.println(metaData.supportsTransactions());//是否支持事務

        System.out.println(metaData.getDatabaseProductName());
    }


    //獲取數據庫列表
    @Test
    public void test02() throws SQLException {
        //1.獲取元數據
        DatabaseMetaData metaData = connection.getMetaData();
        //2.獲取所有數據庫列表
        ResultSet rs = metaData.getCatalogs();
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
        rs.close();
        connection.close();
    }

    //獲取指定數據庫中的表信息
    @Test
    public void test03() throws Exception {

        String driver ="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8";
        String username="root";
        String password="123456";

        Properties props = new Properties();
        props.put("remarksReporting","true");//獲取數據庫的備注信息
        props.put("user",username);
        props.put("password",password);

        //1.獲取連接
        Class.forName(driver);//注冊驅動
        connection = DriverManager.getConnection(url,props);
        //1.獲取元數據
        DatabaseMetaData metaData = connection.getMetaData();

        //2.獲取數據庫中表信息
        /**
         * String catalog, String schemaPattern,String tableNamePattern, String types[]
         *
         *  catalog:當前操作的數據庫
         *      mysql:
         *          :ihrm
         *          catalog
         *      oralce:
         *          xxx:1521:orcl
         *          catalog
         *   schema:
         *      mysql:
         *          :null
         *      oracle:
         *          :用戶名(大寫)
         *
         *    tableNamePattern:
         *      null:查詢所有表
         *      為空:查詢目標表
         *
         *    types:類型
         *      TABLE:表
         *      VIEW:視圖
         *
         */
        ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"});


        while (rs.next()) {
            System.out.println(rs.getString("TABLE_NAME"));
        }
    }


    //獲取指定表中的字段信息
    @Test
    public void test04() throws Exception {
        String driver ="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8";
        String username="root";
        String password="123456";

        Properties props = new Properties();
        props.put("remarksReporting","true");//獲取數據庫的備注信息
        props.put("user",username);
        props.put("password",password);

        //1.獲取連接
        Class.forName(driver);//注冊驅動
        connection = DriverManager.getConnection(url,props);
        DatabaseMetaData metaData = connection.getMetaData();

        //獲取表中的字段信息
        /**
         *  catalog
         *  schema
         *  tableName
         *  columnName
         */
        ResultSet rs = metaData.getColumns(null, null, "pe_user", null);

        while (rs.next()) {
            System.out.println(rs.getString(4));
            //因為他 fields 中第四個的值是 COLUMN_NAME 所以寫COLUMN_NAME 和4 都可以獲取到
            //System.out.println(rs.getString("COLUMN_NAME"));
        }
    }
}
View Code

獲取參數元數據

package com.zhao.metadata;

import org.junit.Before;
import org.junit.Test;

import java.sql.*;
import java.util.Properties;

/**
 * 測試參數元數據(ParameterMetaData)
 *      通過PreparedStatement獲取
 *      獲取sql參數中的屬性信息
 */
public class ParameterMetaDataTest {

    private Connection connection;

    @Before
    public void init() throws Exception {

        String driver ="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8";
        String username="root";
        String password="123456";

        Properties props = new Properties();
        props.put("remarksReporting","true");//獲取數據庫的備注信息
        props.put("user",username);
        props.put("password",password);

        //1.獲取連接
        Class.forName(driver);//注冊驅動
        connection = DriverManager.getConnection(url,props);
    }

    //sql = SELECT * FROM `pe_user` WHERE id=1
    @Test
    public void test() throws Exception {
//        String sql = "select ? from pe_user where id=?";
        String sql = "select * from pe_user where id=?";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        /**
         * parameterIndex 第幾個參數
         * x :參數值
         */
        pstmt.setString(1, "2");
//        pstmt.setString(1, "id");
//        pstmt.setString(2, "2");
        //獲取參數元數據
        ParameterMetaData metaData = pstmt.getParameterMetaData();
        //一共有幾個參數
        int count = metaData.getParameterCount();

        System.out.println(count);
    }
}
View Code

獲取結果集元數據

package com.zhao.metadata;

import org.junit.Before;
import org.junit.Test;

import java.sql.*;
import java.util.Properties;

/**
 * 測試結果集元數據(ResultSetMetaData)
 *      通過ResultSet獲取
 *      獲取查詢結果的信息
 */
public class ResultSetMetaDataTest {

    private Connection connection;

    @Before
    public void init() throws Exception {

        String driver ="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8";
        String username="root";
        String password="123456";

        Properties props = new Properties();
        props.put("remarksReporting","true");//獲取數據庫的備注信息
        props.put("user",username);
        props.put("password",password);

        //1.獲取連接
        Class.forName(driver);//注冊驅動
        connection = DriverManager.getConnection(url,props);
    }


    @Test
    public void test() throws  Exception {
        //sql  注:pe_user這個是我的數據庫表名
        String sql = "select * from pe_user where id=?";
        //PreparedStatement
        PreparedStatement pstmt = connection.prepareStatement(sql);
        pstmt.setString(1, "2");
        //查詢
        ResultSet rs = pstmt.executeQuery();

        //獲取結果集元數據
        ResultSetMetaData metaData = rs.getMetaData();

        //獲取查詢字段個數
        int count = metaData.getColumnCount();

        for(int i =1;i<=count ;i++) {
            //獲取列名
            String columnName = metaData.getColumnName(i);
            //獲取字段類型 sql類型
            String columnType = metaData.getColumnTypeName(i);
            //獲取java類型
            String columnClassName = metaData.getColumnClassName(i);
            System.out.println(columnName+"--"+columnType+"---"+columnClassName);
        }
    }

}
View Code

代碼地址:https://gitee.com/richOne/freemarkerAndMetaData/tree/master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM