1.概述
数据库元数据(DatabaseMetaData):是由Connection对象通过getMetaData方法获取而来,主要封装了是对
数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等。
以下有一些关于DatabaseMetaData的常用方法:
- getDatabaseProductName:获取数据库的产品名称
- getDatabaseProductName:获取数据库的版本号
- getUserName:获取数据库的用户名
- getURL:获取数据库连接的URL
- getDriverName:获取数据库的驱动名称
- driverVersion:获取数据库的驱动版本号
- isReadOnly:查看数据库是否只允许读操作
- supportsTransactions:查看数据库是否支持事务
2.入门案例
(1)构建环境
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency>
(2)获取数据库综合信息
public class DataBaseMetaDataTest {private Connection conn;@Beforepublic 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);}@Testpublic 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);//获取数据库连接URLString 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) 获取数据库列表
@Testpublic 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) 获取某数据库中的所有表信息
@Testpublic void testFindAllTable() throws Exception{//获取元数据DatabaseMetaData metaData = conn.getMetaData();//获取所有的数据库表信息ResultSet tablers = metaData.getTables("ihrm", "", "bs_user", new String[]
{"TABLE"});//拼装tablewhile(tablers.next()) {//所属数据库System.out.println(tablers.getString(1));//所属schemaSystem.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语句中占位符参数的个数
@Testpublic 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中的类型(包名加类名)
@Testpublic 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);}