import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
//测试类
public class Exec {
public static void main(String args[]) {
// 创建窗体类变量
DemoWindow dw = new DemoWindow("带有更新功能的表记录导航窗体");
// 自动缩放窗体以适应组件显示
dw.pack();
// 居中显示窗体
Toolkit theKit = dw.getToolkit();
Dimension wndSize = theKit.getScreenSize();
dw.setBounds(wndSize.width / 2 - dw.getWidth() / 2, wndSize.height / 2
- dw.getHeight() / 2, dw.getWidth(), dw.getHeight());
// 点击关闭按钮可以退出程序
dw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗体为可见
dw.setVisible(true);
}
}
// 带有更新功能的表记录导航窗体类
class DemoWindow extends JFrame implements ActionListener {
// 表记录导航类变量,只需指定数据库名和表名
Transaction trans = new Transaction("Students", "stu");
// Transaction trans = new Transaction("Northwind", "customers");
// 布局面板
JPanel[] jps = null;
JPanel controlJps = new JPanel();
JPanel operatingJps = new JPanel();
// 显示所有字段值的文本框数组
JTextField[] jtfs = null;
// 导航按钮组
JButton jbFirst = new JButton("第 一 条");
JButton jbPre = new JButton("上 一 条");
JButton jbNext = new JButton("下 一 条");
JButton jbLast = new JButton("最后一条");
// 更新按钮组
JButton jbInsert = new JButton("插入记录");
JButton jbUpdate = new JButton("更新记录");
JButton jbDelete = new JButton("删除记录");
JButton jbCancel = new JButton("取消更新");
// 构造函数
public DemoWindow(String title) {
super(title);
// 窗体布局,采用网格布局,列数为1,行数为字段数加3,因为要显示标题标签、所有字段、导航按钮组和更新按钮组
setLayout(new GridLayout(trans.getFieldsCount() + 3, 1));
// 添加标题标签
add(new JLabel(trans.getDatabase() + "数据库: " + trans.getTable() + "表",
JLabel.CENTER));
// 创建布局面板组
jps = new JPanel[trans.getFieldsCount()];
// 创建文本框组
jtfs = new JTextField[trans.getFieldsCount()];
// 设置布局面板和相关组件
for (int i = 0; i < trans.getFieldsCount(); i++) {
// 创建布局面板,每行显示一个字段名称标签和字段值文本框
jps[i] = new JPanel();
JPanel jp = new JPanel();
jp.add(new JLabel(trans.getFieldNames()[i]));
jtfs[i] = new JTextField(20);
jps[i].add(jp);
jps[i].add(jtfs[i]);
add(jps[i]);
}
// 导航按钮组布局
controlJps.add(jbFirst);
controlJps.add(jbPre);
controlJps.add(jbNext);
controlJps.add(jbLast);
add(controlJps);
// 更新按钮组布局
operatingJps.add(jbInsert);
operatingJps.add(jbUpdate);
operatingJps.add(jbDelete);
operatingJps.add(jbCancel);
add(operatingJps);
// 添加事件监听器
jbFirst.addActionListener(this);
jbPre.addActionListener(this);
jbNext.addActionListener(this);
jbLast.addActionListener(this);
jbInsert.addActionListener(this);
jbUpdate.addActionListener(this);
jbDelete.addActionListener(this);
jbCancel.addActionListener(this);
// 填充表记录数据(getFirstRecord返回第一条表记录内容)
fill(trans.getFirstRecord());
}
// 填充表记录数据的函数
public void fill(String[] values) {
// 将所有表记录填充在每个对应的文本框中
for (int i = 0; i < trans.getFieldsCount(); i++) {
jtfs[i].setText(values[i]);
}
}
// 响应单击按钮
public void actionPerformed(ActionEvent e) {
// 处理"第一条"按钮
if (e.getSource() == jbFirst)
fill(trans.getFirstRecord());
// 处理"上一条"按钮
else if (e.getSource() == jbPre)
fill(trans.getPreviousRecord());
// 处理"下一条"按钮
else if (e.getSource() == jbNext)
fill(trans.getNextRecord());
// 处理"最后一条"按钮
else if (e.getSource() == jbLast)
fill(trans.getLastRecord());
// 处理"插入记录"按钮
else if (e.getSource() == jbInsert) {
trans.insertRecord(getAllStrings());
// 重新装载
trans.load();
// 填充最后一条表记录数据
fill(trans.getLastRecord());
}
// 处理"更新记录"按钮
else if (e.getSource() == jbUpdate) {
trans.updateRecord(getAllStrings());
// 重新装载
trans.load();
// 填充当前表记录数据
fill(trans.getAbsoluteRecord(trans.getCurrentRow()));
}
// 处理"删除记录"按钮
else if (e.getSource() == jbDelete) {
trans.deleteRecord(getAllStrings());
// 重新装载
trans.load();
// 填充当前表记录数据
fill(trans.getAbsoluteRecord(trans.getCurrentRow()));
}
// 处理"取消更新"按钮
else if (e.getSource() == jbCancel) {
// 填充当前表记录数据
fill(trans.getAbsoluteRecord(trans.getCurrentRow()));
}
}
// 获取当前所有文本框的值
private String[] getAllStrings() {
String[] values = new String[trans.getFieldsCount()];
for (int i = 0; i < values.length; i++) {
values[i] = jtfs[i].getText();
}
return values;
}
}
// 带有更新功能的表记录导航类
class Transaction {
// 数据库连接
private Connection con = null;
// 数据库命令
private Statement stm = null;
// 结果集
private ResultSet res = null;
// 结果集元数据
private ResultSetMetaData rsmd = null;
// 记录个数
private int recordsCount = 0;
// 字段个数
private int fieldsCount = 0;
// 数据库名称
private String database = null;
// 表名称
private String table = null;
// 字段名称数组
private String[] fieldNames = null;
// 字段值数组
private String[] result = null;
// 当前记录号
private int currentRow = 0;
// 构造函数
public Transaction(String database, String table) {
// 设置数据库名称和表名称
this.database = database;
this.table = table;
// 加载数据库驱动
init();
// 加载表记录信息
load();
}
// 加载数据库驱动的函数
private void init() {
try {
// 加载微软SQL Server 2000数据库驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 对指定数据库建立连接,默认登录方式是独立认证,用户名称为sa,密码为空
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName="
+ this.database, "sa", "");
// 创建支持前后滚动的只读结果集
stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
// 加载表记录信息的函数
public void load() {
try {
// 查询表记录个数
res = stm.executeQuery("select count(*) from " + table);
res.next();
recordsCount = res.getInt(1);
// 查询表记录内容
res = stm.executeQuery("select * from " + table);
// 得到表的元数据信息
rsmd = res.getMetaData();
// 得到表字段个数
fieldsCount = rsmd.getColumnCount();
// 得到表字段名称数组
fieldNames = new String[fieldsCount];
for (int i = 1; i <= fieldsCount; i++) {
fieldNames[i - 1] = rsmd.getColumnName(i);
}
// 创建字段值数组
result = new String[fieldsCount];
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
// 字段个数的读取函数
public int getFieldsCount() {
return fieldsCount;
}
// 记录个数的读取函数
public int getRecordsCount() {
return recordsCount;
}
// 用于关闭连接的析构函数
protected void finalize() throws Throwable {
super.finalize();
try {
con.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
// 字段名称数组的读取函数
public String[] getFieldNames() {
return fieldNames;
}
// 数据库名称的读取函数
public S
评论4
最新资源