1.概述
数据库元数据(DatabaseMetaData):是由Connection对象通过getMetaData方法获取而来,主要封装了是对
数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等。
以下有一些关于DatabaseMetaData的常用方法:
- getDatabaseProductName:获取数据库的产品名称
- getDatabaseProductName:获取数据库的版本号
- getUserName:获取数据库的用户名
- getURL:获取数据库连接的URL
- getDriverName:获取数据库的驱动名称
- driverVersion:获取数据库的驱动版本号
- isReadOnly:查看数据库是否只允许读操作
- supportsTransactions:查看数据库是否支持事务
2.入门案例
(1)构建环境
xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
(2)获取数据库综合信息
java
public class DataBaseMetaDataTest {
private Connection conn;
@Before
public void init() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Properties props =new Properties();
//设置连接属性,使得可获取到表的REMARK(备注)
props.put("remarksReporting","true");
props.put("user", "root");
props.put("password", "111111");
conn = java.sql.DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/?useUnicode=true&characterEncoding=UTF8", props);
}
@Test
public void testDatabaseMetaData() throws SQLException {
//获取数据库元数据
DatabaseMetaData dbMetaData = conn.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);
//获取数据库连接URL
String userUrl = dbMetaData.getURL();
System.out.println(userUrl);
//获取数据库驱动
String driverName = dbMetaData.getDriverName();
System.out.println(driverName);
//获取数据库驱动版本号
String driverVersion = dbMetaData.getDriverVersion();
System.out.println(driverVersion);
//查看数据库是否允许读操作
boolean isReadOnly = dbMetaData.isReadOnly();
System.out.println(isReadOnly);
//查看数据库是否支持事务操作
boolean supportsTransactions = dbMetaData.supportsTransactions();
System.out.println(supportsTransactions);
}
}
(3) 获取数据库列表
java
@Test
public void testFindAllCatalogs() throws Exception {
//获取元数据
DatabaseMetaData metaData = conn.getMetaData();
//获取数据库列表
ResultSet rs = metaData.getCatalogs();
//遍历获取所有数据库表
while(rs.next()){
//打印数据库名称
System.out.println(rs.getString(1));
}
//释放资源
rs.close();
conn.close();
}
(4) 获取某数据库中的所有表信息
java
@Test
public void testFindAllTable() throws Exception{
//获取元数据
DatabaseMetaData metaData = conn.getMetaData();
//获取所有的数据库表信息
ResultSet tablers = metaData.getTables("ihrm", "", "bs_user", new String[]
{"TABLE"});
//拼装table
while(tablers.next()) {
//所属数据库
System.out.println(tablers.getString(1));
//所属schema
System.out.println(tablers.getString(2));
//表名
System.out.println(tablers.getString(3));
//数据库表类型
System.out.println(tablers.getString(4));
//数据库表备注
System.out.println(tablers.getString(5));
}
}
3.参数元数据
参数元数据(ParameterMetaData):是由PreparedStatement对象通过getParameterMetaData方法获取而
来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,ParameterMetaData能提供
占位符参数的个数,获取指定位置占位符的SQL类型等等
以下有一些关于ParameterMetaData的常用方法:
- getParameterCount:获取预编译SQL语句中占位符参数的个数
java
@Test
public void test() throws Exception {
String sql = "select * from bs_user where id=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1063705482939731968");
//获取ParameterMetaData对象
ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
//获取参数个数
int paramCount = paramMetaData.getParameterCount();
System.out.println(paramCount);
}
4.结果集元数据
结果集元数据(ResultSetMetaData):是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据
库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定
列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。
以下有一些关于ResultSetMetaData的常用方法:
- getColumnCount:获取结果集中列项目的个数
- getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
- getColumnTypeName:获取指定列的SQL类型
- getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)
java
@Test
public void test() throws Exception {
String sql = "select * from bs_user where id=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1063705482939731968");
//执行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(columnClassName);
System.out.println(columnTypeName);
}
System.out.println(columnCount);
}