java数据库编程:使用元数据分析数据库
databaseMetaData
使用元数据可以分析数据库基本信息,包括版本,数据库名称,或者指定表的主键。
代码实例
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.DatabaseMetaData ; import java.sql.ResultSet ; public class DatabaseMetaDataDemo{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 DatabaseMetaData dmd = null ; // 数据库元数据 ResultSet rs = null ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; dmd = conn.getMetaData() ; // 实例化对象 System.out.println("数据库名称:" + dmd.getDatabaseProductName() ) ; System.out.println("数据库版本:" + dmd.getDatabaseMajorVersion() + "."//分别得到主版本号和次版本号 + dmd.getDatabaseMinorVersion()) ; rs = dmd.getPrimaryKeys(null,null,"user") ; // 取得user表的主键 while(rs.next()){ System.out.println("表类别:" + rs.getString(1)) ; System.out.println("表模式:" + rs.getString(2)) ; System.out.println("表名称:" + rs.getString(3)) ; System.out.println("列名称:" + rs.getString(4)) ; System.out.println("主键序列号:" + rs.getString(5)) ; System.out.println("主键名称:" + rs.getString(6)) ; } conn.close() ; // 数据库关闭 } };
运行结果:
Sun Apr 23 12:42:47 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 数据库名称:MySQL 数据库版本:5.7 表类别:sys 表模式:null 表名称:user 列名称:age 主键序列号:1 主键名称:PRIMARY
对于获取主键的方法getPrimaryKeys,返回值是什么有以下说明:
当然DatabaseMetaData还有以下等等一堆方法:
ResultSetMetaData
使用这个接口,可以获取ResultSet对象中列的类型和属性,ResultSetMetadata存储了ResultSet的Meta。可以通过以下方法获取ResultSet的信息。
代码实例:
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.ResultSetMetaData ; import java.sql.PreparedStatement ; public class ResultSetMetaDataDemo{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 ResultSetMetaData rsmd = null ; // 数据库元数据 PreparedStatement pstmt = null ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; String sql = "SELECT name,age,birthday FROM user" ; pstmt = conn.prepareStatement(sql) ; // 实例化对象 rsmd = pstmt.getMetaData() ; //注意,这里没有进行pstmt进行语句执行。 System.out.println("一共返回" + rsmd.getColumnCount() + "条数据。") ; if(rsmd.isAutoIncrement(1) ){ System.out.println(rsmd.getColumnName(1)+"列是自动增长的。") ; } conn.close() ; // 数据库关闭 } };
输出结果:
Sun Apr 23 12:56:59 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 一共返回3条数据。
因为这个表的主键是age,并且没有设置自动增长。
以上操作,一般在数据开发的底层比较经常使用,类似反射机制,取得基本信息,基本开发是不会使用的。