数据库元数据

本文介绍了Java中通过三个核心类获取数据库元数据的方法:DataBaseMetaData、ParameterMetaData 和 ResultSetMetaData,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在java中,用于获取数据库中的元数据主要有三个类:

DataBaseMetaData

ParameterMetaData

ResultSetMetaData

使用元数据可以用来编写自己的框架。下面分别描述下这三个类,

1、DataBaseMetaData

这个类的对象可以通过Connection.getDatabaseMetaData()方法获取。

主要方法有:

•getURL():返回一个String类对象,代表数据库的URL。
•getUserName():返回连接当前数据库管理系统的用户名。
•getDatabaseProductName():返回数据库的产品名称。
•getDatabaseProductVersion():返回数据库的版本号。
•getDriverName():返回驱动驱动程序的名称。
•getDriverVersion():返回驱动程序的版本号。
•isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

//DataBaseMeta方法,code示例演示

public void getMetaData(){
		try{			
			conn = JdbcC3p0Pools.getConnection2();
			
			//获取数据库元数据
			DatabaseMetaData dbmt = conn.getMetaData();
			
			//获取数据库大版本号和小版本号
			int majorVer = dbmt.getDatabaseMajorVersion();
			int minorVer = dbmt.getDatabaseMinorVersion();
			System.out.println(majorVer+"."+minorVer);
			
			//获取数据库产品名称和版本号
			String proName = dbmt.getDatabaseProductName();
			String proVer = dbmt.getDatabaseProductVersion();
			System.out.println("product name:"+proName);
			System.out.println("product version:"+proVer);
			
			//获取数据库驱动大小版本号和数据库驱动名称和版本号
			int drvMajVer = dbmt.getDriverMajorVersion();
			int drvMinVer = dbmt.getDriverMinorVersion();
			String drvName = dbmt.getDriverName();
			String drvVer = dbmt.getDriverVersion();
			
			System.out.println(drvMajVer+"."+drvMinVer);
			System.out.println("driver name:"+drvName);
			System.out.println("driver version:"+drvVer);
			
			//获取数据库的URL和用户名,及数据库是否只读
			System.out.println(dbmt.getURL());
			System.out.println(dbmt.getUserName());
			System.out.println(dbmt.isReadOnly());
			
			//获取数据库中的各个表
			rs = dbmt.getCatalogs();
			while(rs.next()){
				System.out.println(rs.getObject(1));
			}
			
			sql = "select name, money from account";
			ps = conn.prepareStatement(sql);
			
			ParameterMetaData pm = ps.getParameterMetaData();
			//获取参数个数
			System.out.println(pm.getParameterCount());		
			
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			JdbcC3p0Pools.release(conn, ps, rs);
		}
	}
输出结果:

5.1
product name:MySQL
product version:5.1.57-community
5.1
driver name:MySQL Connector Java
driver version:mysql-connector-java-5.1.26 ( Revision: ${bzr.revision-id} )
jdbc:mysql://localhost:3306/jdbc
root@localhost
false

2、ParameterMetaData

此类是用来获取PreparedStatement元数据的参数对象,通过ps.getParameterMetaData()方法来获取ParameterMetaData类对象。此类方法主要有:

•getParameterCount()
获得指定参数的个数
•getParameterType(int param)
获得指定参数的sql类型


//ParameterMetaData方法,code示例演示

public void getParameterMetaData(){
		try{			
			conn = JdbcC3p0Pools.getConnection2();
			
			
			sql = "select name, money from account where name=? and money>?";
			ps = conn.prepareStatement(sql);
			
			ParameterMetaData pm = ps.getParameterMetaData();
			//获取参数个数
			System.out.println(pm.getParameterCount());
			
			//获取参数类型和名称
			int count = pm.getParameterCount();
			for(int i=1; i<=count; i++){
				System.out.println(pm.getParameterType(i));
				System.out.println(pm.getParameterTypeName(i));//mysql不支持此方法
			}
			
			pm.getParameterClassName(1);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			JdbcC3p0Pools.release(conn, ps, rs);
		}
	}

3、ResultSetMetaData

此类是用来获取ResultSet元数据,可以通过ps.getMetaData或者rs.getMetaData()方法来获取。其主要方法有:

getColumnCount()
返回resultset对象的列数
getColumnName(int column)
获得指定列的名称
 getColumnTypeName(int column)
获得指定列的类型

//ResultSetMetaData 类元数据 code演示

public void getResultSetMetaData(){
		try{			
			conn = JdbcC3p0Pools.getConnection3();
			
			sql = "select * from person";
			ps = conn.prepareStatement(sql);
			
			ParameterMetaData pm = ps.getParameterMetaData();	
			ResultSetMetaData rsmt = ps.getMetaData();
			
			int colCount = rsmt.getColumnCount();
			int lineWidth = 0;
			int tmpCount = colCount;
			while(tmpCount>0){
				lineWidth +=(rsmt.getColumnDisplaySize(colCount)+3);
				tmpCount--;
			}
			
			StringBuffer sb = new StringBuffer();
			addToBuffer(sb, "-", lineWidth);
			addToBuffer(sb, "\r", 1);
			int width = 0;
			while(colCount>0){
				
				width = rsmt.getColumnDisplaySize(colCount)+2;
				String colName = rsmt.getColumnName(colCount);
				addToBuffer(sb, "|", 1);
				addToBuffer(sb, " ", (width-2-colName.length())/2);
				addToBuffer(sb, colName,1);
				addToBuffer(sb, " ", (width-2-colName.length())/2);		
				
				colCount--;
			}
			addToBuffer(sb, "|", 1);
			addToBuffer(sb, "\r", 1);
			addToBuffer(sb, "-", lineWidth);
			addToBuffer(sb, "\r", 1);
			
			rs = ps.executeQuery();
			rsmt = rs.getMetaData();
			
			while(rs.next()){
				colCount = rsmt.getColumnCount();
				while(colCount>0){
					width = rsmt.getColumnDisplaySize(colCount)+2;
					String colName = rsmt.getColumnName(colCount);
					Object obj = rs.getObject(colName);
					StringBuffer sb2 = new StringBuffer();
					sb2.append(obj);
					addToBuffer(sb, "|", 1);
					addToBuffer(sb, " ", (width-2-sb2.toString().length())/2);
					addToBuffer(sb, obj,1);
					addToBuffer(sb, " ", (width-2-sb2.toString().length())/2);		
					
					colCount--;
				}
				
				addToBuffer(sb, "|", 1);
				addToBuffer(sb, "\r", 1);
				addToBuffer(sb, "-", lineWidth);
				addToBuffer(sb, "\r", 1);
			}
			System.out.println(sb.toString());
			
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			JdbcC3p0Pools.release(conn, ps, rs);
		}
	}
	
	public void addToBuffer(StringBuffer sb, Object sig, int count){
		
		while(count>0){
			sb.append(sig);
			count--;
		}
		
	}

//输出

---------------------------------------------
|   salary   |        name        |    id    |
---------------------------------------------
|   1000.0   |      wx      |     1     |
---------------------------------------------
|   2000.0   |      xt      |     2     |
---------------------------------------------
|   4000.0   |       ws       |     3     |
---------------------------------------------
|   5000.0   |         阿良         |     4     |
---------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值