JDBC元数据简介

大家好,我是一个爱举铁的程序员Shr

本篇文章将会介绍JDBC中的元数据。

源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc/metadata

一、什么是元数据?

描述数据库或其组成部分的数据成为元数据(区别于那些存在数据库中的实际数据)[1]。

二、元数据的分类

通过JDBC可以获得三种元数据,数据库元数据,SQL语句参数元数据,结果集元数据。

三、举个栗子

3.1 新建表

在数据库dao_20180603中新建表emp。

CREATE TABLE `emp` (
  `id` int(11) NOT NULL,
  `name` varchar(255) default NULL,
  `address` varchar(255) default NULL,
  `hireDate` datetime default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.2 新建类

public class Emp {
    private int id;
    private String name;
    private String address;
    private Date hireDate;
    public Emp() {
    }
    public Emp(int id, String name, String address, Date hireDate) {
        this.id = id;
        this.name = name;
        this.address = address;
        this.hireDate = hireDate;
    }
    @Override
    public String toString() {
        return "Emp [id=" + id + ", name=" + name + ", address=" + address + ", hireDate=" + hireDate + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Date getHireDate() {
        return hireDate;
    }
    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }
}

3.3 测试

3.3.1 获取数据库元数据

JDBCUtil类是JDBC简介那篇文章中写过的DBUtil,只是换了类名。

public class MetaDataTest {
    /**
     * 获取数据库元数据
     */
    @Test
    public void getDatabaseMetaData() throws Exception{
        Connection connection = JDBCUtil.getConnection();
        DatabaseMetaData databaseMetaData = connection.getMetaData();
        // 获取数据库名称
        String databaseProductName = databaseMetaData.getDatabaseProductName();
        System.out.println(databaseProductName);
        // 获取驱动版本
        String driverName = databaseMetaData.getDriverVersion();
        System.out.println(driverName);
        // 获取数据库连接URL
        String url = databaseMetaData.getURL();
        System.out.println(url);
        // 获取用户名
        String userName = databaseMetaData.getUserName();
        System.out.println(userName);
        JDBCUtil.close(null, null, connection);
    }
}

运行结果:

MySQL

mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e20009be )

jdbc:mysql://localhost:3306/dao_20180603?characterEncoding=utf8

root@

3.3.2 获取SQL执行对象元数据

    /**
     * 获取SQL执行对象元数据
     */
    @Test
    public void getParameterMetaData() throws Exception {
        Connection connection = JDBCUtil.getConnection();
        String sql = "insert into emp(id,name,address,hiredate) values(?,?,?,?)";
        PreparedStatement prepareStatement = connection.prepareStatement(sql);
        ParameterMetaData parameterMetaData = prepareStatement.getParameterMetaData();
        // 取到参数个数
        int parameterCount = parameterMetaData.getParameterCount();
        System.out.println(parameterCount);
        JDBCUtil.close(null, prepareStatement, connection);
    }

运行结果:

4

3.3.3 获取结果集元数据

    /**
     * 获取结果集元数据
     */
    @Test
    public void getResultSetMetaData() throws Exception{
        // 获取数据库连接对象
        Connection connection = JDBCUtil.getConnection();
        // sql语句
        String sql = "select id,name,address,hiredate from emp";
        // 获取SQL执行对象
        PreparedStatement prepareStatement = connection.prepareStatement(sql);
        // 获取结果集
        ResultSet resultSet = prepareStatement.executeQuery();
        // 获取结果集元数据
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        // 获取查询出来的总列数
        int columnCount = resultSetMetaData.getColumnCount();
        System.out.println("columnCount : " + columnCount);
        // 获取指定列的类型常量,在java.sql.Types类中可以查找到
        int columnType = resultSetMetaData.getColumnType(2);
        System.out.println("columnType : " + columnType);
        // 获取指定列的类型字符串,如INT,VARCHAR
        String columnTypeName = resultSetMetaData.getColumnTypeName(2);
        System.out.println("columnTypeName : " + columnTypeName);
        // 获取指定列的列名,如hiredate
        String columnName = resultSetMetaData.getColumnName(4);
        System.out.println("columnName : " + columnName);
        JDBCUtil.close(resultSet, prepareStatement, connection);
    }

运行结果:

columnCount : 4

columnType : 12

columnTypeName : VARCHAR

columnName : hireDate

参考文献

[1] (美)霍斯特曼(Horstmann),科内尔(Cornell).Java核心技术卷2:高级特性(原书第8版)[M].机械工业出版社,2008

源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc/metadata

猜你喜欢

转载自blog.csdn.net/ShrMuscles/article/details/80558791