在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 |
---------------------------------------------