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