public class Wenben extends JFrame implements TableModelListener{
JTable table;
Vectorhang;
Vector lie;//fang 4ge
Vector h1;
//数据调用
public void dy(){
lie.add("ID");
lie.add("name");
lie.add("time");
lie.add("money");
String url = "jdbc:odbc:uaccess";// 根据数据源,设置数据库URL
String userName = "sh";// 登录数据库用户名
String password = "sh";// 用户密码
Connection conn = null;// 声明Connection对象
Statement stmt = null;// 声明Statement对象
try {
// 加载JDBC-ODBC驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// 创建连接
conn = DriverManager.getConnection(url);//("jdbc:odbc:driver={microsoft access driver (*.mdb)};dbq=d:/user/2011级计算机系学生信息.mdb");
// 通过Connection对象,创建Statement对象
stmt = conn.createStatement();
// 执行查询"年龄为20岁的学生信息"的SQL语句,得到结果集
ResultSet rs = stmt.executeQuery("select * from 员工信息表 ");
// 通过循环输出相关学生信息
/*
System.out.println("学号" + "\t\t姓名" + "\t性别" + "\t出生日期"+ "\t年龄" + "\t专业方向"
+ "\t\t\t宿舍");
*/
while (rs.next()) {
String id = rs.getString("ID");
String name = rs.getString("姓名");
String time = rs.getString("时间");
int money=rs.getInt("金钱");
h1.add(id);
h1.add(name);
h1.add(time);
h1.add(money);
hang.add(h1);
System.out.println(id + "\t" + name + "\t" + time + "\t" + money
+ "\t");
} rs.close(); // 关闭结果集
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
//数据调用结束
public Wenben(){
super("JTable测试");
TableModel model=new DefaultTableModel(hang,lie);
model.addTableModelListener(this);
table=new JTable(model);
table.setFillsViewportHeight(true);
table.setAutoCreateRowSorter(true);
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
/*setSize(300, 200);setVisible(true);validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/
}
public void tableChanged(TableModelEvent e){
}
public static void main(String args[]){
Wenben wb=new Wenben();
wb.dy();
}
}
Vector hang; Vector lie; Vector h1; 这三项都没有初始化,直接调用Vector.add()一定是空指针。
应该Vector hang = new Vector(); Vector lie = new Vector();
另外, ResultSet循环体里用的h1都是同一个Vector对象,应该每行数据初始一个Vector,放入hang中。
问题1:Vector没有进行初始化,当然也就发生空指针一场了,其中全局变量hang和lie都应该new一次Vector hang = new Vector(); Vector lie = new Vector();
问题2:逻辑问题,h1作为保存数据库每一行的记录,最好作为局部变量,并且放在while (rs.next()) {}这个循环语句中,每次循环,都new一个新的对象,再将该对象放入hang变量中。将开头的Vector h1去掉,而在while循环中增减Vector h1 = new Vector();
问题3:优化问题,关闭数据库连接最好放在try语句块中,因为如果发生异常,数据库岂不是不用关闭?应当在catch语句块后面增加finally,将关闭数据库连接放在finally中,这样即使前面发生异常,finally中的语句还是可以正常执行的,数据库就可以及时关闭了