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中的类型(包名加类名)
    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();
复制代码
  • 私信