當你使用和學習JDK的時候,可以查看並學習它所提供給你的兩個ResultSetMetaData
和DataBaseMetaData類的源碼並很好的了解它們的實現原理和思路,JDBC中提供有兩種源數據,一種是數據庫源數據,另一種是 ResultSet源數據。這些源數據就是描述存儲用戶數據的容器的數據結構。其中ResultSetMetaData類完成了查詢結果信息和結果中的列的各種信息。下面我就以ResultSetMetaData為例,簡單的羅列它的使用方法以及它內部的方法的使用。
首先,建立一張表並起名為users,表結構描述如下:
字段描述 字段名稱 是否為空 是否主鍵
用戶編號 id Not Null P
用戶名稱 userName Not Null
用戶密碼 password Not Null
你也可以通過DLL執行下面腳本:(本人使用Mysql)
CREATE TABLE `users` (
`id` varchar(32) NOT NULL,
`userName` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
然后向該表中插入幾條數據。
最后,新建一個測試類名為TestDemo.java,源代碼如下:
package com.wanglihu.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class TestDemo {
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/struts2Demo";
String user = "root";
String pass = "123456";
conn = DriverManager.getConnection(url,user,pass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args){
Connection conn=getConnection();
String sql="select * from users";
PreparedStatement stmt;
try {
stmt = conn.prepareStatement(sql);
ResultSet rs=stmt.executeQuery(sql);
ResultSetMetaData data=rs.getMetaData();
while(rs.next()){
for(int i = 1 ; i<= data.getColumnCount() ; i++){
//獲得所有列的數目及實際列數
int columnCount=data.getColumnCount();
//獲得指定列的列名
String columnName = data.getColumnName(i);
//獲得指定列的列值
String columnValue = rs.getString(i);
//獲得指定列的數據類型
int columnType=data.getColumnType(i);
//獲得指定列的數據類型名
String columnTypeName=data.getColumnTypeName(i);
//所在的Catalog名字
String catalogName=data.getCatalogName(i);
//對應數據類型的類
String columnClassName=data.getColumnClassName(i);
//在數據庫中類型的最大字符個數
int columnDisplaySize=data.getColumnDisplaySize(i);
//默認的列的標題
String columnLabel=data.getColumnLabel(i);
//獲得列的模式
String schemaName=data.getSchemaName(i);
//某列類型的精確度(類型的長度)
int precision= data.getPrecision(i);
//小數點后的位數
int scale=data.getScale(i);
//獲取某列對應的表名
String tableName=data.getTableName(i);
// 是否自動遞增
boolean isAutoInctement=data.isAutoIncrement(i);
//在數據庫中是否為貨幣型
boolean isCurrency=data.isCurrency(i);
//是否為空
int isNullable=data.isNullable(i);
//是否為只讀
boolean isReadOnly=data.isReadOnly(i);
//能否出現在where中
boolean isSearchable=data.isSearchable(i);
System.out.println(columnCount);
System.out.println("獲得列"+i+"的字段名稱:"+columnName);
System.out.println("獲得列"+i+"的字段值:"+columnValue);
System.out.println("獲得列"+i+"的類型,返回SqlType中的編號:"+columnType);
System.out.println("獲得列"+i+"的數據類型名:"+columnTypeName);
System.out.println("獲得列"+i+"所在的Catalog名字:"+catalogName);
System.out.println("獲得列"+i+"對應數據類型的類:"+columnClassName);
System.out.println("獲得列"+i+"在數據庫中類型的最大字符個數:"+columnDisplaySize);
System.out.println("獲得列"+i+"的默認的列的標題:"+columnLabel);
System.out.println("獲得列"+i+"的模式:"+schemaName);
System.out.println("獲得列"+i+"類型的精確度(類型的長度):"+precision);
System.out.println("獲得列"+i+"小數點后的位數:"+scale);
System.out.println("獲得列"+i+"對應的表名:" + tableName);
System.out.println("獲得列"+i+"是否自動遞增:"+isAutoInctement);
System.out.println("獲得列"+i+"在數據庫中是否為貨幣型:"+isCurrency);
System.out.println("獲得列"+i+"是否為空:"+isNullable);
System.out.println("獲得列"+i+"是否為只讀:"+isReadOnly);
System.out.println("獲得列"+i+"能否出現在where中:"+isSearchable);
}
}
} catch (SQLException e) {
System.out.println("數據庫連接失敗");
}
}
}
