Java第一個GUI專案-學生資訊查詢-MVC結構
阿新 • • 發佈:2018-11-04
M部分:
package model;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import javax.swing.table.*; import jdbcUtil.SqlHelper; //把對學生表的各種操作封裝到一個模型中
@SuppressWarnings("serial")
public class Model extends AbstractTableModel{ //rowData用來存放行資料 //columnNames用來存放列名 @SuppressWarnings("rawtypes")
Vector rowData,columnNames;
//定義操作資料庫需要的東西 PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; String url="jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; String user="root"; String passwd=""; String driver="com.mysql.jdbc.Driver"; //新增學生(增,刪,改) public boolean updStu(String sql,String []paras) { //建立sqlHelper(如果程式併發性不考慮,可以把sqlHelper做成static) SqlHelper sqlHelper = new SqlHelper(); return sqlHelper.updExecute(sql, paras); } //查詢的本質就是初始化 @SuppressWarnings({ "rawtypes", "unchecked" })
public void queryStu(String sql,String []paras) { SqlHelper sqlHelper =null; //中間 columnNames=new Vector(); //設定列名 columnNames.add("學號"); columnNames.add("名字"); columnNames.add("性別"); columnNames.add("年齡"); columnNames.add("籍貫"); columnNames.add("系別"); rowData=new Vector(); try{ sqlHelper = new SqlHelper(); ResultSet rs=sqlHelper.queryExecute(sql, paras); while(rs.next()) {
Vector hang=new Vector(); hang.add(rs.getString(1)); hang.add(rs.getString(2)); hang.add(rs.getString(3)); hang.add(rs.getInt(4)); hang.add(rs.getString(5)); hang.add(rs.getString(6));
//加入到rowData rowData.add(hang);
}
}catch(Exception e){ e.printStackTrace(); }finally{ sqlHelper.close(); } } //得到共有多少行 public int getRowCount() {
return this.rowData.size();
}
//得到共有多少列 public int getColumnCount() {
return this.columnNames.size();
} //得到某行某列的資料 @SuppressWarnings("rawtypes") public Object getValueAt(int row, int column) {
return ((Vector)this.rowData.get(row)).get(column);
}
@Override public String getColumnName(int column) {
return (String)this.columnNames.get(column);
}
} V部分:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import javax.swing.table.*; import jdbcUtil.SqlHelper; //把對學生表的各種操作封裝到一個模型中
@SuppressWarnings("serial")
public class Model extends AbstractTableModel{ //rowData用來存放行資料 //columnNames用來存放列名 @SuppressWarnings("rawtypes")
Vector rowData,columnNames;
//定義操作資料庫需要的東西 PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; String url="jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; String user="root"; String passwd=""; String driver="com.mysql.jdbc.Driver"; //新增學生(增,刪,改) public boolean updStu(String sql,String []paras) { //建立sqlHelper(如果程式併發性不考慮,可以把sqlHelper做成static) SqlHelper sqlHelper = new SqlHelper(); return sqlHelper.updExecute(sql, paras); } //查詢的本質就是初始化 @SuppressWarnings({ "rawtypes", "unchecked" })
public void queryStu(String sql,String []paras) { SqlHelper sqlHelper =null; //中間 columnNames=new Vector(); //設定列名 columnNames.add("學號"); columnNames.add("名字"); columnNames.add("性別"); columnNames.add("年齡"); columnNames.add("籍貫"); columnNames.add("系別"); rowData=new Vector(); try{ sqlHelper = new SqlHelper(); ResultSet rs=sqlHelper.queryExecute(sql, paras); while(rs.next()) {
Vector hang=new Vector(); hang.add(rs.getString(1)); hang.add(rs.getString(2)); hang.add(rs.getString(3)); hang.add(rs.getInt(4)); hang.add(rs.getString(5)); hang.add(rs.getString(6));
//加入到rowData rowData.add(hang);
}
}catch(Exception e){ e.printStackTrace(); }finally{ sqlHelper.close(); } } //得到共有多少行 public int getRowCount() {
return this.rowData.size();
}
//得到共有多少列 public int getColumnCount() {
return this.columnNames.size();
} //得到某行某列的資料 @SuppressWarnings("rawtypes") public Object getValueAt(int row, int column) {
return ((Vector)this.rowData.get(row)).get(column);
}
@Override public String getColumnName(int column) {
return (String)this.columnNames.get(column);
}
} 對話方塊:
import javax.swing.*; import model.Model; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; @SuppressWarnings("serial")
public class StuAddDialog extends JDialog implements ActionListener{ //定義我需要的swing元件 JLabel jl1,jl2,jl3,jl4,jl5,jl6; JButton jb1,jb2; JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6; JPanel jp1,jp2,jp3; //owner它的父視窗 //title 視窗名 //modal 指定是模態視窗,還是非模態視窗 public StuAddDialog(Frame owner,String title ,boolean modal) { super(owner,title,modal);//呼叫父類構造方法,達到模式對話方塊效果 jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jl1=new JLabel("學號"); jl2=new JLabel("姓名"); jl3=new JLabel("性別"); jl4=new JLabel("年齡"); jl5=new JLabel("籍貫"); jl6=new JLabel("系別"); jtf1=new JTextField(); jtf2=new JTextField(); jtf3=new JTextField(); jtf4=new JTextField(); jtf5=new JTextField(); jtf6=new JTextField(); jb1=new JButton("新增"); //註冊監聽 jb1.addActionListener(this); jb2=new JButton("取消"); jb2.addActionListener(this); //設定佈局 jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1)); //新增元件 jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp3.add(jb1); jp3.add(jb2); this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); //展現 this.setSize(300,250); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb1) { //希望新增 Model temp=new Model(); String sql="insert into stu values(?,?,?,?,?,?)"; String []paras={jtf1.getText(),jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText()}; if(!temp.updStu(sql, paras)) { //提示 JOptionPane.showMessageDialog(this, "新增失敗"); } //關閉對話方塊 this.dispose(); } else if(e.getSource()==jb2) {
this.dispose();
} } } //負責對學生的資訊進行更新的類
import javax.swing.*; import model.Model; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@SuppressWarnings("serial")
public class StuupdDialog extends JDialog implements ActionListener{ //定義我需要的swing元件 JLabel jl1,jl2,jl3,jl4,jl5,jl6; JButton jb1,jb2; JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6; JPanel jp1,jp2,jp3; //owner它的父視窗 //title 視窗名 //modal 指定是模態視窗,還是非模態視窗 public StuupdDialog(Frame owner,String title ,boolean modal,Model sm,int rowNums) { super(owner,title,modal);//呼叫父類構造方法,達到模式對話方塊效果
jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jl1=new JLabel("學號"); jl2=new JLabel("姓名"); jl3=new JLabel("性別"); jl4=new JLabel("年齡"); jl5=new JLabel("籍貫"); jl6=new JLabel("系別"); jtf1=new JTextField(); //初始化資料 jtf1.setText((String)sm.getValueAt(rowNums, 0)); //讓jtf1不能修改 jtf1.setEditable(false); jtf2=new JTextField(); jtf2.setText((String)sm.getValueAt(rowNums, 1)); jtf3=new JTextField(); jtf3.setText((String)sm.getValueAt(rowNums, 2)); jtf4=new JTextField(); jtf4.setText((String)sm.getValueAt(rowNums, 3).toString()); jtf5=new JTextField(); jtf5.setText((String)sm.getValueAt(rowNums, 4)); jtf6=new JTextField(); jtf6.setText((String)sm.getValueAt(rowNums, 5)); jb1=new JButton("修改"); //註冊監聽 jb1.addActionListener(this); jb2=new JButton("取消");
jb2.addActionListener(this); //設定佈局 jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1)); //新增元件 jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp3.add(jb1); jp3.add(jb2); this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); //展現 this.setSize(300,250); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb1) { //對使用者點選新增按鈕後的響應動作 //做一個sql //預編譯語句物件 String str="update stu set stuName=?,stuSex=?," + "stuAge=?,stuJg=?,stuDept=? where stuId=?"; String []paras={jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText(),jtf1.getText()}; Model temp=new Model(); temp.updStu(str, paras); this.dispose(); } else if(e.getSource()==jb2) {
this.dispose();
} } } C部分: package jdbcUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; //用於對資料庫進行操作的類
public class SqlHelper { //定義操作資料庫需要的東西 PreparedStatement ps=null;
Connection ct=null;
ResultSet rs=null;
String url="jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; String user="root"; String passwd=""; String driver="com.mysql.jdbc.Driver"; //關閉資料庫資源 public void close()
{
//關閉
try{
if(rs!=null) rs.close();
if(ps!=null) ps.close();
if(ct!=null) ct.close();
}catch(Exception e){
e.printStackTrace();
} } //寫了一個不需要注入的方法
public ResultSet queryExcecute(String sql)
{
try{
//1.載入驅動
Class.forName(driver);
//2.得到連線
ct=DriverManager.getConnection(url,user,passwd);
//3.建立ps
ps=ct.prepareStatement(sql);
rs=ps.executeQuery();
}catch(Exception e){ e.printStackTrace(); }finally{
//關閉資源
} return rs; } //查詢資料庫的操作 public ResultSet queryExecute(String sql,String []paras) { try{ //1.載入驅動 Class.forName(driver); //2.得到連線 ct=DriverManager.getConnection(url,user,passwd); //3.建立ps ps=ct.prepareStatement(sql); //給ps的?賦值 for(int i=0;i<paras.length;i++) { ps.setString(i+1, paras[i]); }
rs=ps.executeQuery(); }catch(Exception e){ e.printStackTrace(); }finally{
//關閉資源
} return rs; } //把增刪改合在一起 public boolean updExecute(String sql,String []paras) {
boolean b=true;
try{ //1.載入驅動 Class.forName(driver); //2.得到連線 ct=DriverManager.getConnection(url,user,passwd); //3.建立ps ps=ct.prepareStatement(sql); //給ps的?賦值 for(int i=0;i<paras.length;i++) {
ps.setString(i+1, paras[i]);
} //4.執行操作 if(ps.executeUpdate()!=1) {
b=false;
}
}catch(Exception e){ b=false;
e.printStackTrace(); }finally{
this.close();
}
return b;
} }