文章目录
- 前言
- 获取元数据
- 获取表名
- 获取主键
- 获取外键
- 获取字段
前言
学习了jdbc元数据的使用,觉得这能在一定程度上提高开发效率,就总结出来分享分享。
获取元数据
这里使用单元测试来演示,连接数据库的操作均在自己封装的工具类实现不在此处演示。为了便于理解,异常也都直接抛出不做处理。
获取表名
@Test
public void testGetTable() throws SQLException{
// 获取连接对象,我的数据库连接均在工具方法中读取属性文件时实现
Connection conn = ConnectionPool.getInstance().getConnection();
//根据连接对象,获取元数据
DatabaseMetaData dbmd= conn.getMetaData();
//根据元数据查询当前所连数据库的表信息
String[] types = {"TABLE"};
ResultSet rs = dbmd.getTables(null, null, "%", types);
//获取查询结果的元数据用于打印
ResultSetMetaData rmd = rs.getMetaData();
while(rs.next()){
for(int i = 1;i <= rmd.getColumnCount();i ++){
System.out.println(rmd.getColumnName(i)+"\t"+rs.getString(i));
}
}
}
运行可以看到如下结果
每张表有5个信息,其中第3个就是我们需要的表名
获取主键
代码在之前获得表名的基础上继续获得每张表的主键
@Test
public void testGetPK() throws SQLException{
Connection conn = ConnectionPool.getInstance().getConnection();
DatabaseMetaData dbmd= conn.getMetaData();
String[] types = {"TABLE"};
ResultSet rs = dbmd.getTables(null, null, "%", types);
ResultSetMetaData rmd = rs.getMetaData();
while(rs.next()){
//3对应的位置就是表名
String tableName = rs.getString(3);
System.out.println(tableName);
//根据表名获得主键结果集
ResultSet pks = dbmd.getPrimaryKeys(null, null, tableName);
//根据结果集元数据打印内容
ResultSetMetaData pkmd = pks.getMetaData();
while(pks.next()){
for(int i = 1;i <= pkmd.getColumnCount();i ++){
System.out.println(pkmd.getColumnName(i)+"\t"+pks.getString(i));
}
}
}
}
打印的结果如下,可以看到4位置是我们需要的主键名字
获取外键
@Test
public void testGetFK()throws SQLException{
Connection conn = ConnectionPool.getInstance().getConnection();
DatabaseMetaData dbmd= conn.getMetaData();
String[] types = {"TABLE"};
ResultSet rs = dbmd.getTables(null, null, "%", types);
ResultSetMetaData rmd = rs.getMetaData();
while(rs.next()){
String tableName = rs.getString(3);
System.out.println(tableName);
//根据表名获得外键
ResultSet fks = dbmd.getImportedKeys(null, null, tableName);
ResultSetMetaData fkmd = fks.getMetaData();
while(fks.next()){
for(int i = 1;i <= fkmd.getColumnCount();i ++){
System.out.println(fkmd.getColumnName(i)+"\t"+fks.getString(i));
}
}
}
}
可以看到,如果有外键的话,数据还是挺多的;其中字段名有两个一个是外键在当前表的字段名,另一个是外键在依赖表的主键字段名。
获取字段
@Test
public void testGetColumnName()throws SQLException{
Connection conn = ConnectionPool.getInstance().getConnection();
DatabaseMetaData dbmd= conn.getMetaData();
String[] types = {"TABLE"};
ResultSet rs = dbmd.getTables(null, null, "%", types);
ResultSetMetaData rmd = rs.getMetaData();
while(rs.next()){
String tableName = rs.getString(3);
System.out.println("------"+tableName);
//根据表名用sql查询,但无需获得数据,只需要元数据即可
String sql = "SELECT * FROM "+tableName+" WHERE 1 = 0";
Statement stmt = conn.createStatement();
ResultSet results = stmt.executeQuery(sql);
//获得sql查询的元数据并打印
ResultSetMetaData rsmd = results.getMetaData();
for(int i = 1;i <= rsmd.getColumnCount();i ++){
System.out.println(rsmd.getColumnName(i)); //获得字段名
}
}
}
这样就能拿到每张表中的字段名,结果如下
当然也能通过元数据获得字段的其他信息,比如字段类型、字段大小;之后生成代码用到时再展示。