JDBC - DatabaseMetaData,ResultSet,ResultSetMetaData并实现ORM

1 利用DatabaseMetaData获取连接,以及数据库信息

JDBC为我们提供了一系列用来操作数据库的方法,接口.其中,DatabaseMetaData为我们提供了获取数据库信息,当前驱动等一系列方法,举几个常用的方法; 
1.获取 DatabaseMetaData 对象,因为DatabaseMetaData是一个接口,要获取当前连接的信息,所以前提必要要有一个连接

Connection conn = DriverManger.getConnection(url,username,password);

2.然后利用conn提供的方法获取DatabaseMetaData对象

DatabaseMetaData meteData = conn.getMetaData();

3.DatabaseMetaData常用方法

System.out.println("连接URL"+info.getURL());
System.out.println("数据库管理系统用户名:"+info.getUserName());
System.out.println("是否是只读"+info.isReadOnly());
System.out.println("数据库版本名称"+info.getDatabaseProductName());
System.out.println("返回数据库版本号:"+info.getDatabaseProductVersion());
System.out.println("驱动程序名称:"+info.getDriverName());
System.out.println("驱动程序的版本号:"+info.getDriverVersion());

​

2 利用ResultSetMetaData获取查询数据记录集信息

------. 描述ResultSet信息的数据——ResultSetMetaData:

    1) MetaData即元数据,即描述其它数据的数据,因此ResultSetMetaData就是描述ResultSet的元数据;

    2) 通常在你对查询结果不了解的情况下可以使用该元数据来了解结果集的记录有几列,每列的类型是啥,每列的名称是啥?


=====分析ResultSet元数据:

    1) 首先你要获得ResultSetMetaData对象(必定是从属于某个ResultSet对象):ResultSetMetaData ResultSet.getMetaData();

    2) 元数据对象中最常用的三种方法来获取记录的有关信息:都是ResultSetMetaData的对象方法

         i. int getColumnCount(); // 获取列数

         ii. String getColumnName(int column);  // 获取指定列的列名,列索引从1开始计

         iii. int getColumnType(int column);  // 获取指定列的SQL类型,是Types中定义的静态常量

因为获取的是查询记录集的信息,所以要用ResultSet获取ResultSertMeteData对象 


1.获取连接

Connection conn = DriverManger.getConnection(url,username,password);

2.返回查询记录集

PreparedStatement pstmt = conn.prepareStatment("select *from tb_user");
ResultSet res = pstmt.executeQuery();

3.获取ResultSetMetaData 对象

ResultSetData resultSetData = res.getMetaData();

4.用setData的方法获取查询记录集相关信息

int col = resultSetData.getColumnCount();//获取列数
System.out.println(col);
System.out.println(resultSetData.getCatalogName(1));
for (int i = 1; i <= col; i++) {//遍历列
	System.out.print(resultSetData.getColumnLabel(i) + "\t");
}
System.out.println();
while (rs.next()) {
	for (int i = 1; i <= col; i++) {//遍历数据
		System.out.print(rs.getString(i) + "\t" + "\t");
	}
	System.out.println();
}

5  java.sql.ResultSetMetaData.getColumnLabel和getColumnName的区别

如果将ResultSet的结果映射到HashMap中,要使用getColumnLabel,而不要用getColumnName,这样可提高程序的健壮性

理由:

getColumnName返回的是sql语句中field的原始名字。
getColumnLabel是field的SQL AS的值(Alias--别名)。
比如:select 
          a.name as name,
          a.description as description,
          b.description as relatedDescription 
         from a,b where ...
此时,getColumnName(3) == "description";而getColumnLabel(3) == "relatedDescription"。

API:

getColumnLabel

String getColumnLabel(int column)
                      throws SQLException

Gets the designated column's suggested title for use in printouts and displays. The suggested title is usually specified by the SQL AS clause. If a SQL AS is not specified, the value returned from getColumnLabel will be the same as the value returned by the getColumnName method.

Parameters:

column - the first column is 1, the second is 2, ...

Returns:

the suggested column title

Throws:

SQLException - if a database access error occurs

getColumnName

String getColumnName(int column)
                     throws SQLException

Get the designated column's name.

 Parameters:

column - the first column is 1, the second is 2, ...

Returns:

column name

Throws:

SQLException - if a database access error occurs

接下来可以看

JDBC之用元数据将结果集封装为List对象

https://www.cnblogs.com/bluedream2009/archive/2009/10/23/1588401.html

核心代码如下

conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData resultSetMetaData = ps.getMetaData();

// 取得结果集列数
int columnCount = resultSetMetaData.getColumnCount();

// 构造泛型结果集
List<Map<String, Object>> listMaps = new ArrayList<Map<String, Object>>();
Map<String, Object> dataMap = null;

// 循环结果集
while (rs.next()) {
    dataMap = new HashMap<String, Object>();
    // 每循环一条将列名和列值存入Map
    for (int i = 1; i < columnCount; i++) {
        data.put(resultSetMetaData.getColumnLabel(i), rs.getObject(resultSetMetaData.getColumnLabel(i)));
    }
    // 将整条数据的Map存入到List中
    listMaps.add(dataMap);
}
return listMaps;

猜你喜欢

转载自blog.csdn.net/uotail/article/details/81809897