文章目录

  • 前言
  • 获取元数据
  • 获取表名
  • 获取主键
  • 获取外键
  • 获取字段


前言

学习了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));
			}
		}
	}

运行可以看到如下结果

ResultSet 对象获取字段备注 resultset获取表名_数据库


每张表有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位置是我们需要的主键名字

ResultSet 对象获取字段备注 resultset获取表名_数据库_02

获取外键

@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));
				}
			}
			
		}
	}

可以看到,如果有外键的话,数据还是挺多的;其中字段名有两个一个是外键在当前表的字段名,另一个是外键在依赖表的主键字段名。

ResultSet 对象获取字段备注 resultset获取表名_ResultSet 对象获取字段备注_03

获取字段

@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));				//获得字段名
			}
		}
	}

这样就能拿到每张表中的字段名,结果如下

ResultSet 对象获取字段备注 resultset获取表名_数据库_04


当然也能通过元数据获得字段的其他信息,比如字段类型、字段大小;之后生成代码用到时再展示。