?? databasetest1.java
字號(hào):
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.applet.Applet;
import java.sql.*;
import java.awt.event.*;
import java.util.Vector;
/**DatabaseTest1類的目的是取得數(shù)據(jù)庫(kù)中的信息以表格的形式顯示出來(lái)*/
public class DatabaseTest1{
public static void main(String args[]){
/*聲明一個(gè)JFrame對(duì)象,標(biāo)題為"FancyTable"*/
JFrame frame=new JFrame("An example of database!");
/*聲明一個(gè)JLabel對(duì)象,用于放在JFrame正上方*/
JLabel titleLabel=new JLabel("Talbe demo!");
/*聲明了兩個(gè)JPanel對(duì)象,mainPanel用于放置顯示數(shù)據(jù)所用的表格,subPanel用于放置上面的sortButton和queryButton兩個(gè)按鈕*/
JPanel mainPanel=new JPanel(false);
/*聲明一個(gè)JScrollPane對(duì)象tablePanel,用于使得生成的表格帶有滾動(dòng)條*/
JScrollPane tablePanel;
/*調(diào)用本類中的createTable()方法生成表格*/
tablePanel=createTable();
mainPanel.add(tablePanel);
/*為Frame對(duì)象注冊(cè)窗口事件監(jiān)聽(tīng)器,這樣就可以單擊界面右上方的關(guān)閉按鈕退出程序的運(yùn)行*/
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);}});
/*將mainPanel添加到Frame中的Center位置*/
frame.getContentPane().add("Center",mainPanel);
/*使Frame以最緊湊的樣式顯示*/
frame.pack();
/*使Frame可見(jiàn)*/
frame.setVisible(true);
}
/**createTable() creates a table and add the table to a JScrollPane,then return the JScrollPane*/
public static JScrollPane createTable(){
TableModel stuTable;
JDBCAdapter dt;
/*聲明Vector型變量rowVector,用于存放讀取到的信息*/
Vector rowVector;
/*聲明JTable對(duì)象,用于會(huì)創(chuàng)建一個(gè)顯示讀取信息的表格*/
JTable table;
/*通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)獲得的數(shù)據(jù)創(chuàng)建表格*/
/*url指定需要訪問(wèn)的數(shù)據(jù)庫(kù)名稱*/
String url="jdbc:odbc:MyDatabase";
/*driver指定訪問(wèn)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序的名稱*/
String driver="sun.jdbc.odbc.JdbcOdbcDriver";
/*user和password用于指定訪問(wèn)數(shù)據(jù)庫(kù)時(shí)使用的用戶名和密碼*/
String user="sa";
String password="";
/*query代表需要執(zhí)行的SQL語(yǔ)句*/
String query="select * from student1";
/*通過(guò)構(gòu)造一個(gè)JDBCAdapter類的對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù)*/
dt=new JDBCAdapter(url,driver,user,password);
/*對(duì)指定的數(shù)據(jù)庫(kù)MyDatabase執(zhí)行SQL語(yǔ)句,executeQuery方法是類JDBCAdapter中定義的*/
dt.executeQuery(query);
/*將取得的結(jié)果賦給stuTable對(duì)象*/
stuTable=dt;
/*根據(jù)取得的數(shù)據(jù)創(chuàng)建表格*/
table=new JTable(stuTable);
/*用矢量rowVector存放取得的數(shù)據(jù)行向量*/
rowVector=dt.rows;
/*使得表格各列的大小設(shè)置為可以自動(dòng)調(diào)節(jié)*/
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
/*根據(jù)創(chuàng)建的表格生成JScrollPane對(duì)象,這樣表格就可以帶有滾動(dòng)條*/
JScrollPane scrollpane=new JScrollPane(table);
return scrollpane;
}
}
/**類JDBCAdapter是AbstractTableModel的子類*/
class JDBCAdapter extends AbstractTableModel {
/*聲明一個(gè)Connection對(duì)象,用于和數(shù)據(jù)庫(kù)建立連接*/
Connection connection;
/*聲明一個(gè)Statement對(duì)象,用于對(duì)數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句*/
Statement statement;
/*聲明一個(gè)ResultSet對(duì)象,用于存放SQL語(yǔ)句執(zhí)行的結(jié)果*/
ResultSet resultSet;
/*定義一個(gè)字符串?dāng)?shù)組,用于存放結(jié)果集中的列數(shù)*/
String[] columnNames = {};
/*聲明一個(gè)Vector對(duì)象,用于將取得的數(shù)據(jù)按行放在rows中*/
Vector rows = new Vector();
/*聲明ResultSetMetaData對(duì)象,用于從ResultSet對(duì)象中獲得數(shù)據(jù)屬性和類型*/
ResultSetMetaData metaData;
/**下面是構(gòu)造方法,四個(gè)參數(shù)分別代表要連接的數(shù)據(jù)庫(kù),驅(qū)動(dòng)程序,用戶名和密碼*/
public JDBCAdapter(String url, String driverName,
String user, String passwd) {
try {
/*返回driverName字符串對(duì)應(yīng)的類對(duì)象*/
Class.forName(driverName);
/*輸出"Opening db connection"提示信息*/
System.out.println("Opening db connection");
/*下面的語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的連接*/
connection = DriverManager.getConnection(url, user, passwd);
/*創(chuàng)建SQL語(yǔ)句*/
statement = connection.createStatement();
}
catch (ClassNotFoundException ex) {
/*輸出沒(méi)有找到數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類的信息*/
System.err.println("Cannot find the database driver classes.");
System.err.println(ex);
}
catch (SQLException ex) {
/*輸出不能連接到數(shù)據(jù)庫(kù)的信息*/
System.err.println("Cannot connect to this database.");
System.err.println(ex);
}
}
/**executeQuery(String query)方法執(zhí)行字符串參數(shù)query指定的語(yǔ)句*/
public void executeQuery(String query) {
/*if語(yǔ)句中的條件表示數(shù)據(jù)庫(kù)連接不成功或者沒(méi)有創(chuàng)建SQL語(yǔ)句*/
if (connection == null || statement == null) {
System.err.println("There is no database to execute the query.");
return;
}
try {
/*執(zhí)行SQL語(yǔ)句,將結(jié)果放在結(jié)果集對(duì)象resultSet中*/
resultSet = statement.executeQuery(query);
/*通過(guò)getMetaData()方法將resultSet中的數(shù)據(jù)傳到ResultSetMetaData對(duì)象metaData中*/
metaData = resultSet.getMetaData();
/*獲得metaData中數(shù)據(jù)的列數(shù)*/
int numberOfColumns = metaData.getColumnCount();
/*根據(jù)取得的列數(shù)創(chuàng)建字符串?dāng)?shù)組,數(shù)組的長(zhǎng)度就是上面得到的列數(shù)*/
columnNames = new String[numberOfColumns];
/*將取得數(shù)據(jù)的各列名稱賦給字符串?dāng)?shù)組中的各元素*/
for(int column = 0; column < numberOfColumns; column++) {
columnNames[column] = metaData.getColumnLabel(column+1);
}
/*對(duì)rows進(jìn)行初始化*/
rows = new Vector();
while (resultSet.next()) {
/*聲明一個(gè)Vector對(duì)象newRow,用于存放取得結(jié)果集中一行數(shù)據(jù)*/
Vector newRow = new Vector();
/*利用一個(gè)for循環(huán),將結(jié)果集中一行數(shù)據(jù)放到newRow矢量中*/
for (int i = 1; i <= getColumnCount(); i++) {
newRow.addElement(resultSet.getObject(i));
}
/*將上面的矢量newRow作為矢量rows中的一個(gè)元素,這樣rows中的一個(gè)元素就代表結(jié)果集中的一行數(shù)據(jù)*/
rows.addElement(newRow);
}
/*將發(fā)生的事件提交給監(jiān)聽(tīng)器*/
fireTableChanged(null); // Tell the listeners a new table has arrived.
}
catch (SQLException ex) {
System.err.println(ex);
}
}
/**將前面生成的結(jié)果集對(duì)象、SQL語(yǔ)句對(duì)象和數(shù)據(jù)庫(kù)連接對(duì)象關(guān)閉*/
public void close() throws SQLException {
System.out.println("Closing db connection");
resultSet.close();
statement.close();
connection.close();
}
/**通過(guò)finalize()執(zhí)行上面的close()方法*/
protected void finalize() throws Throwable {
close();
super.finalize();
}
/**
* Implementation of the TableModel Interface
*/
/*重寫(xiě)getColumnName方法,獲得參數(shù)column指定列的名稱*/
public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
} else {
return "";
}
}
/*值得注意的是,實(shí)現(xiàn)TabelModel接口,必須重寫(xiě)下面三個(gè)方法*/
/**重寫(xiě)getColumnCount方法,獲得列數(shù)*/
public int getColumnCount() {
return columnNames.length;
}
/**重寫(xiě)getRowCount方法,獲得行數(shù)*/
public int getRowCount() {
return rows.size();
}
/**重寫(xiě)getValueAt方法,獲得參數(shù)指定位置的對(duì)象*/
public Object getValueAt(int aRow, int aColumn) {
Vector row = (Vector)rows.elementAt(aRow);
return row.elementAt(aColumn);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -