JDBC针对元数据的操作主要由常用的三个接口展开,即Connection对应数据库元数据(DatabaseMetaData),Statement对应参数元数据(ParameterMetaData),ResultSet对应结果集元数据(ResultSetMetaData)。
package com.heima.mybatis.test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import org.junit.Test;
import com.heima.mybatis.utils.JdbcUtils;
public class MetaDataTest {
@Test
public void databaseMetaData() throws SQLException{
Connection conn = JdbcUtils.getConn();
DatabaseMetaData metaData = conn.getMetaData();
String url = metaData.getURL();//返回一个String类对象,代表数据库的URL。
String userName = metaData.getUserName();//返回连接当前数据库管理系统的用户名
String databaseProductName = metaData.getDatabaseProductName();//返回数据库的产品名称
String databaseProductVersion = metaData.getDatabaseProductVersion();//返回数据库的版本号
String driverName = metaData.getDriverName();//返回驱动驱动程序的名称
String driverVersion = metaData.getDriverVersion();//返回驱动程序的版本号
boolean readOnly = metaData.isReadOnly();//返回一个boolean值,指示数据库是否只允许读操作
System.out.println(url+"=="+userName+"=="+databaseProductName+"=="+databaseProductVersion);
System.out.println(databaseProductVersion+"=="+driverName+"=="+driverVersion+"=="+readOnly);
}
@Test
public void parameterMetaData() throws SQLException{
Connection conn = JdbcUtils.getConn();
String sql = "select * from emp where empno=? and ename=?";
PreparedStatement pst = conn.prepareStatement(sql);
/**
* 如果数据库为Oracle,驱动包class12.jar会报如下错误
* java.lang.AbstractMethodError: Method oracle/jdbc/driver/T4CPreparedStatement.getParameterMetaData()
* oracle驱动包class12.jar没有对getParameterMatadat的实现,换成ojdbc.jar,,这些驱动包在这里可以找到(E:\oracle\product\10.2.0\db_1\jdbc\lib);
*/
ParameterMetaData parameterMetaData = pst.getParameterMetaData();
int parameterCount = parameterMetaData.getParameterCount();//获得指定参数的个数
System.out.println(parameterCount);
}
@Test
public void resultSetMetaData() throws SQLException{
Connection conn = JdbcUtils.getConn();
String sql = "select * from emp where empno=? and ename=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, 1001);
pst.setString(2, "zhaoyun");
ResultSet rs = pst.executeQuery();
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();//返回resultset对象的列数
System.out.println(columnCount);
while(rs.next()){
for(int i=1;i<=columnCount;i++){
String columnName = resultSetMetaData.getColumnName(i);//获得指定列的名称
int columnType = resultSetMetaData.getColumnType(i);
String columnTypeName = resultSetMetaData.getColumnTypeName(i);//获得指定列的类型
Object object = rs.getObject(i);//获取指定类的值
System.out.println(columnName+"====="+columnType+"======"+columnTypeName+"=="+object);
}
}
}
}