📄 databasetest1.java
字号:
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类的目的是取得数据库中的信息以表格的形式显示出来*/
public class DatabaseTest1{
public static void main(String args[]){
/*声明一个JFrame对象,标题为"FancyTable"*/
JFrame frame=new JFrame("An example of database!");
/*声明一个JLabel对象,用于放在JFrame正上方*/
JLabel titleLabel=new JLabel("Talbe demo!");
/*声明了两个JPanel对象,mainPanel用于放置显示数据所用的表格,subPanel用于放置上面的sortButton和queryButton两个按钮*/
JPanel mainPanel=new JPanel(false);
/*声明一个JScrollPane对象tablePanel,用于使得生成的表格带有滚动条*/
JScrollPane tablePanel;
/*调用本类中的createTable()方法生成表格*/
tablePanel=createTable();
mainPanel.add(tablePanel);
/*为Frame对象注册窗口事件监听器,这样就可以单击界面右上方的关闭按钮退出程序的运行*/
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);}});
/*将mainPanel添加到Frame中的Center位置*/
frame.getContentPane().add("Center",mainPanel);
/*使Frame以最紧凑的样式显示*/
frame.pack();
/*使Frame可见*/
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对象,用于会创建一个显示读取信息的表格*/
JTable table;
/*通过JDBC访问数据库获得的数据创建表格*/
/*url指定需要访问的数据库名称*/
String url="jdbc:odbc:MyDatabase";
/*driver指定访问数据库的驱动程序的名称*/
String driver="sun.jdbc.odbc.JdbcOdbcDriver";
/*user和password用于指定访问数据库时使用的用户名和密码*/
String user="sa";
String password="";
/*query代表需要执行的SQL语句*/
String query="select * from student1";
/*通过构造一个JDBCAdapter类的对象来访问数据库*/
dt=new JDBCAdapter(url,driver,user,password);
/*对指定的数据库MyDatabase执行SQL语句,executeQuery方法是类JDBCAdapter中定义的*/
dt.executeQuery(query);
/*将取得的结果赋给stuTable对象*/
stuTable=dt;
/*根据取得的数据创建表格*/
table=new JTable(stuTable);
/*用矢量rowVector存放取得的数据行向量*/
rowVector=dt.rows;
/*使得表格各列的大小设置为可以自动调节*/
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
/*根据创建的表格生成JScrollPane对象,这样表格就可以带有滚动条*/
JScrollPane scrollpane=new JScrollPane(table);
return scrollpane;
}
}
/**类JDBCAdapter是AbstractTableModel的子类*/
class JDBCAdapter extends AbstractTableModel {
/*声明一个Connection对象,用于和数据库建立连接*/
Connection connection;
/*声明一个Statement对象,用于对数据库执行SQL语句*/
Statement statement;
/*声明一个ResultSet对象,用于存放SQL语句执行的结果*/
ResultSet resultSet;
/*定义一个字符串数组,用于存放结果集中的列数*/
String[] columnNames = {};
/*声明一个Vector对象,用于将取得的数据按行放在rows中*/
Vector rows = new Vector();
/*声明ResultSetMetaData对象,用于从ResultSet对象中获得数据属性和类型*/
ResultSetMetaData metaData;
/**下面是构造方法,四个参数分别代表要连接的数据库,驱动程序,用户名和密码*/
public JDBCAdapter(String url, String driverName,
String user, String passwd) {
try {
/*返回driverName字符串对应的类对象*/
Class.forName(driverName);
/*输出"Opening db connection"提示信息*/
System.out.println("Opening db connection");
/*下面的语句进行数据库的连接*/
connection = DriverManager.getConnection(url, user, passwd);
/*创建SQL语句*/
statement = connection.createStatement();
}
catch (ClassNotFoundException ex) {
/*输出没有找到数据库驱动程序类的信息*/
System.err.println("Cannot find the database driver classes.");
System.err.println(ex);
}
catch (SQLException ex) {
/*输出不能连接到数据库的信息*/
System.err.println("Cannot connect to this database.");
System.err.println(ex);
}
}
/**executeQuery(String query)方法执行字符串参数query指定的语句*/
public void executeQuery(String query) {
/*if语句中的条件表示数据库连接不成功或者没有创建SQL语句*/
if (connection == null || statement == null) {
System.err.println("There is no database to execute the query.");
return;
}
try {
/*执行SQL语句,将结果放在结果集对象resultSet中*/
resultSet = statement.executeQuery(query);
/*通过getMetaData()方法将resultSet中的数据传到ResultSetMetaData对象metaData中*/
metaData = resultSet.getMetaData();
/*获得metaData中数据的列数*/
int numberOfColumns = metaData.getColumnCount();
/*根据取得的列数创建字符串数组,数组的长度就是上面得到的列数*/
columnNames = new String[numberOfColumns];
/*将取得数据的各列名称赋给字符串数组中的各元素*/
for(int column = 0; column < numberOfColumns; column++) {
columnNames[column] = metaData.getColumnLabel(column+1);
}
/*对rows进行初始化*/
rows = new Vector();
while (resultSet.next()) {
/*声明一个Vector对象newRow,用于存放取得结果集中一行数据*/
Vector newRow = new Vector();
/*利用一个for循环,将结果集中一行数据放到newRow矢量中*/
for (int i = 1; i <= getColumnCount(); i++) {
newRow.addElement(resultSet.getObject(i));
}
/*将上面的矢量newRow作为矢量rows中的一个元素,这样rows中的一个元素就代表结果集中的一行数据*/
rows.addElement(newRow);
}
/*将发生的事件提交给监听器*/
fireTableChanged(null); // Tell the listeners a new table has arrived.
}
catch (SQLException ex) {
System.err.println(ex);
}
}
/**将前面生成的结果集对象、SQL语句对象和数据库连接对象关闭*/
public void close() throws SQLException {
System.out.println("Closing db connection");
resultSet.close();
statement.close();
connection.close();
}
/**通过finalize()执行上面的close()方法*/
protected void finalize() throws Throwable {
close();
super.finalize();
}
/**
* Implementation of the TableModel Interface
*/
/*重写getColumnName方法,获得参数column指定列的名称*/
public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
} else {
return "";
}
}
/*值得注意的是,实现TabelModel接口,必须重写下面三个方法*/
/**重写getColumnCount方法,获得列数*/
public int getColumnCount() {
return columnNames.length;
}
/**重写getRowCount方法,获得行数*/
public int getRowCount() {
return rows.size();
}
/**重写getValueAt方法,获得参数指定位置的对象*/
public Object getValueAt(int aRow, int aColumn) {
Vector row = (Vector)rows.elementAt(aRow);
return row.elementAt(aColumn);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -