暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JDBC元数据简介

ShrMus 2018-06-04
370

大家好,我是一个爱举铁的程序员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


文章转载自ShrMus,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论