这两天遇到最困难的地方应该就是JTable部分,如何从数据库中导出数据并在表格中显示,使用的是两个向量,titlevector和studentvector. 刚开始的时候,我用的是字符串数组,结果要考虑两个字符串的对应顺序,非常繁杂.又后来,没有注意到表格的组成结构,没有把参数作为全局变量,而导致后期删除元素等操作频频出错!意识到这个问题后,昨天晚上迷迷糊糊中我想着,明天要把两个向量作为全局变量,作为面板的属性.
Vector titilevector = null;
Vector studentvector = null;
其中titilevector作为表格的标题,studentvector作为表格主体,其中它的元素是学生记录向量!,一定要特别注意这一点,我的同学也出现这个问题了,当然我也遇到了,如下面
当时错误的写法
哇,代码写错了!!!!在表格的studentvector中的元素应该是一条学生记录向量,而不是学号字符串,名字字符串等一波字符串!应该先创建一个向量,把这些查出来的一条学生记录信息放到向量中,在把这个向量放到studentvector中
正确的写法:
studentvector.clear();
try {
while(rs.next()) {
Vector stu = new Vector();
stu.add(rs.getString(1));
stu.add(rs.getString(2));
stu.add(rs.getString(3));
stu.add(rs.getString(4));
stu.add(rs.getString(5));
stu.add(rs.getString(6));
stu.add(rs.getString(7));
studentvector.add(stu);
//System.out.println(rs.getString(1));System.out.println(rs.getString(1));
}
table.updateUI();
参考资料:
java.lang.String cannot be cast to java.util.Vector
======================我是分割线========================
弄好了这两个向量,学会从数据库中导出数据并添加到studentvector中。解决这关键的一点.其余要做的就是与数据库建立连接,并执行不同的sql语句。例如下面的查询,第一天就在搞有关数据库的操作了,其中也有查询的部分,不过那个查询是范围的查询,这里要做的是按照字段的查询,有点区别的,多了【多表连接查询】部分。要用到【多表连接查询 】,是因为学生表中有关班级、院系的数据是外键,分别是班级表、院系表的主键。
【多表连接查询 】:
student.class = class.Id AND student.department = department.Id
示例代码:
String sql = "select studentID ,student.name,sex,class.name,department.name,birthday,native_place from student ,class,department where student.class = class.Id AND student.department = department.Id";
String item = jCBSelectQueryFieldTransfer(SelectQueryFieldStr); //得到属性列
sql+= " and " + item;
sql +=" = " + "'" + sQueryField + "'";
dbProcess.connect();
ResultSet rs = dbProcess.executeQuery(sql);
关键的地方:
-
jCBSelectQueryFieldTransfer(SelectQueryFieldStr): 由于从表中属性列得到是中文字符串,需要转换为数据库属性列的英文字符串。
这里执行的sql语句里面的班级代码(classid)是从班级表中通过班级名得到的,同样的,院系代码(departmentid)是从院系代码表中通过院系名得到的。这样也很好的符合:查询文本框里的内容是中文字符串的情况,避免无谓的转换(以前我是用一个function进行中文和英文代码的转换)
把outputstr = class 该为 outputstr = class.name 还有outputstr = department 该为outputStr = department.name。各个表的属性列如下:
student表:
class表:
department表:
代码如下:
public String jCBSelectQueryFieldTransfer(String InputStr)
{
String outputStr = "";
System.out.println("jCBSelectQueryFieldTransfer(). InputStr = " + InputStr);
if(InputStr.equals("学号")){
outputStr = "studentID";
}else if(InputStr.equals("姓名")){
outputStr = "student.name";
}else if(InputStr.equals("性别")){
outputStr = "sex";
}else if(InputStr.equals("班级")){
outputStr = "class.name";
}else if(InputStr.equals("院系")){
outputStr = "department.name";
}
查询所有结果:
按字段查询结果:
查询这块差不多了,可能有点缺陷的就是没有建立多个查询条件进行查询,像我同学说的,搞6个查询文本框,进行多条件查询,他遇到sql语句的建立问题:当有多个条件的时候,需要用and进行连接,如果是第一个条件语句,那么and就多余了,我说用一个标志位flag,初始为false,当第一个条件语句建立的时候,不加and,并且flag变为true,后面的条件的建立都加and。
还有更新、删除操作。
这些操作需要先确定一条记录,这里是通过为表格添加监听器来确定的:
table.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); // 获得行位置
System.out.println("mouseClicked(). row = " + row);
Vector v = new Vector();
v = (Vector) studentvector.get(row);
studentIDtextField.setText((String) v.get(0));// 学号
nametextField.setText((String) v.get(1));// 姓名
sextextField.setText((String) v.get(2));// 性别
classtextField.setText((String)v.get(3));// 班级
departmenttextField.setText((String) v.get(4));// 院系
birthdaytextField_4.setText((String) v.get(5));// 出生年月
placetextField_3.setText((String) v.get(6));
}
});
这里鼠标点击事件设置了每个文本框的内容,点击每行都会确定一条信息。包括学号,姓名,班级,院系,出生年月等。例如下面点击学号为2的一行记录:
比如要进行删除的话,就先通过String sNo = studentIDtextField.getText().trim();确定学号,然后进行删除。删除代码如下:
// 建立删除条件
String sql = "delete from student where studentID = '" + sNo + "';";
System.out.println("deleteCurrentRecordProcess(). sql = " + sql);
try{
if (dbProcess.executeUpdate(sql) < 1) {
System.out.println("deleteCurrentRecordProcess(). delete database failed.");
}
}catch(Exception e){
System.out.println("e = " + e);
JOptionPane.showMessageDialog(null,
"数据操作错误","错误",JOptionPane.ERROR_MESSAGE);
}
其中 dbProcess.executeUpdate(sql) < 1 中具体方法如下,它返回的是一个整数,表示有多少条信息受影响。通过这个方法,我们不仅可以执行删除操作,还可以执行其他的修改操作,增加操作。只是传过的sql语句参数不同罢了。
//执行增、删、改语句的方法
public int executeUpdate(String sql) {
int count = 0;
connect();
try {
Statement stmt = connection.createStatement();
count = stmt.executeUpdate(sql);
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
}
disconnect();
return count;
}
后文:
看了隔壁班的情况,我去,他们都在搞界面优化了。我反正是很苦逼的敲代码,基本上很多逻辑功能是自己实现的,虽然有的地方可能界面不是很好看,但是一点一点都是自己敲下来的。遇到问题,解决问题,反复思考,以至于同学出现错误了,很多时候都知道我知道怎么解决。后期工作就是优化界面,优化代码,精益求精吧。然后参考别人“专业”的代码,好好总结一番。这都是下周的事情了!
今晚上得准备ppt了,明天下午要做报告了!