一、什么是元数据
其实就是对数据库、表、列的定义信息的封装.
二、DataBaseMetaData
【数据库的元数据】
Connection.getMetaData():返回DataBaseMetaData
对象
getURL()
:返回一个
String
类对象,代表数据库的
URL
。
getUserName()
:返回连接当前数据库管理系统的用户名。
getDatabaseProductName()
:返回数据库的产品名称。
getDatabaseProductVersion()
:返回数据库的版本号。
getDriverName()
:返回驱动驱动程序的名称。
getDriverVersion()
:返回驱动程序的版本号。
isReadOnly()
:返回一个
boolean
值,指示数据库是否只允许读操作
三、ParameterMetaData
【
Sql
语句的元数据】
PreparedStatement.getParameterMetaData()
:返回ParameterMetaData
对象。
getParameterCount()
:获得指定参数的个数
getParameterType(int param)
:获得指定参数的
sql
类型(驱动可能不支持)
四、ResultSetMetaData
【结果集的元数据】
ResultSet.getMetaData()
:返回
ResultSetMetaData
对象。
ResultSetMetaData.getColumnCount()
:返回
resultset
对象的
列数
getColumnName(int column)
:获得指
定列的名称
getColumnTypeName(int column)
:获得指
定列的类型
java.sql.Types
五、使用演示
项目结构
demo1
package demo1;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import utils.JdbcUtils;
public class DatabaseMetaDataDemo {
public static void main(String[] args) {
//1.通过c3p0连接池获得连接
Connection conn = JdbcUtils.getConnection();
//2.拿到DatabaseMetaData对象
try {
DatabaseMetaData data = conn.getMetaData();
//测试1:获取url -->jdbc:mysql:///mydb1
System.out.println(data.getURL());
//测试2:获取当前连接数据库的用户名 -->root@localhost
System.out.println(data.getUserName());
//测试3:获取当前数据库的名称 -->MySQL
System.out.println(data.getDatabaseProductName());
//测试4:获取当前数据库的版本信息 -->5.5.49
System.out.println(data.getDatabaseProductVersion());
//测试5:获取驱动的名称 -->MySQL Connector Java
System.out.println(data.getDriverName());
//测试6:获取驱动的版本 -->ysql-connector-java-5.1.39 ( Revision: 3289a357af6d09ecc1a10fd3c26e95183e5790ad )
System.out.println(data.getDriverVersion());
//测试7:是否是只读的 -->false
System.out.println(data.isReadOnly());
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(null, null, conn);
}
}
}
demo2
package demo2;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import utils.JdbcUtils;
public class ParameterMetaDataDemo {
public static void main(String[] args) {
// 1.通过cp30获取连接对象
Connection conn = JdbcUtils.getConnection();
PreparedStatement stmt = null;
try {
// 2.得到PreparedStatement对象
stmt = conn.prepareStatement("update account set money = ? where id= ?");
// 3.得到ParameterMetaData元数据
ParameterMetaData data = stmt.getParameterMetaData();
// 测试:获得占位符的个数
System.out.println(data.getParameterCount());
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(null, stmt, conn);
}
}
}
demo3
package demo3;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import utils.JdbcUtils;
public class ResultSetMetaDataDemo {
public static void main(String[] args) {
// 1.通过cp30获取连接对象
Connection conn = JdbcUtils.getConnection();
PreparedStatement stmt = null;
ResultSet rs = null;
// 2.得到PreparedStatement对象
try {
stmt = conn.prepareStatement("select * from account");
// 3.拿到结果集
rs = stmt.executeQuery();
// 4.通过结果集拿到结果集的元数据
ResultSetMetaData data = rs.getMetaData();
// 测试:获得列的个数
System.out.println("count=" + data.getColumnCount());
// 测试:获得所有的列名和具体的类型
for (int i = 0; i < data.getColumnCount(); i++) {
// 得到列名
System.out.println("name=" + data.getColumnName(i + 1));
// 获得列名具体的类型 值
System.out.println("type=" + data.getColumnType(i + 1));
// 得到具体列的类型
System.out.println("typeName=" + data.getColumnTypeName(i + 1));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(rs, stmt, conn);
}
}
}