1. 建立數據庫連接
例1.1 使用JDBC-ODBC橋來連接一個Access數據庫。
該數據庫的名稱為FirstExample,在ODBC數據源中的名稱為forStudy,用戶名和密碼均為空。
package connectDataBase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class connect { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加載數據庫驅動 Connection con =DriverManager.getConnection("jdbc:odbc:forStudy","", ""); //這里是ODBC數據源名稱 System.out.println("數據庫連接成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
2. 關閉數據庫連接
例2.1 關閉數據庫連接示例。
package connectDataBase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class connect { public static void main(String[] args) { Connection con = null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加載數據庫驅動 con =DriverManager.getConnection("jdbc:odbc:forStudy","", ""); //這里是ODBC數據源名稱 System.out.println("數據庫連接成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ //在這里關閉數據庫 if(con!=null){ try { if(!con.isClosed()) con.close(); //關閉數據庫連接 System.out.println("數據庫已關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } }
3. 添加新數據
一般將SQL語句存放在一個Statement對象中,然后先執行該對象的executeUpdate()方法就可以了。
例3.1 向數據庫中添加新數據。
package connectDataBase; import java.sql.*; public class insertData { public static void main(String[] args) { Connection con = null; Statement sta; String sqlString = "insert into student values('30','小王','男','湖南湘潭','N-408','8293456')"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy","",""); System.out.println("數據庫連接成功!"); sta = con.createStatement(); sta.executeUpdate(sqlString); System.out.println("插入成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } }
一個可以接收用戶輸入的程序:
package connectDataBase; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.sql.*; public class insertData { public static void main(String[] args) { Connection con = null; Statement sta; String code,name,sex,address,room,tel; code = getInput("請輸入編號: "); name = getInput("請輸入姓名: "); sex = getInput("請輸入性別: "); address = getInput("請輸入地址: "); room = getInput("請輸入寢室: "); tel = getInput("請輸入電話: "); String sqlString = "insert into student values('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+tel+"')"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy","",""); System.out.println("數據庫連接成功!"); sta = con.createStatement(); sta.executeUpdate(sqlString); System.out.println("插入成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } private static String getInput(String str) { String msg = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print(str); msg = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return msg; } }
單純地通過拼接字符串的方式將程序中的變量組合成標准的SQL語句是非常容易出錯的,如果字符本身中還含有雙引號或單引號,轉化工作就會變的更為困難。所以,java又提供了一個PreparedStatement類,該類一個重要的作用就是提供了一個“占位符”,可以方便程序員進行轉換的工作。
上面的程序可以改為:
package connectDataBase; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.sql.*; public class insertData { public static void main(String[] args) { Connection con = null; // Statement sta; PreparedStatement ps; String code,name,sex,address,room,tel; code = getInput("請輸入編號: "); name = getInput("請輸入姓名: "); sex = getInput("請輸入性別: "); address = getInput("請輸入地址: "); room = getInput("請輸入寢室: "); tel = getInput("請輸入電話: "); // String sqlString = "insert into student values('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+tel+"')"; String sqlString = "insert into student values(?,?,?,?,?,?)"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy","",""); System.out.println("數據庫連接成功!"); // sta = con.createStatement(); // sta.executeUpdate(sqlString); ps = con.prepareStatement(sqlString); ps.setString(1, code); //替換第一個占位符 ps.setString(2, name); ps.setString(3, sex); ps.setString(4, address); ps.setString(5, room); ps.setString(6, tel); ps.executeUpdate(); System.out.println("插入成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } private static String getInput(String str) { String msg = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print(str); msg = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return msg; } }
程序運行結果如下:
請輸入編號: 0013 請輸入姓名: 張三 請輸入性別: 男 請輸入地址: 河南鄭州 請輸入寢室: A-527 請輸入電話: 8723641 數據庫連接成功! 插入成功! 數據庫關閉!
4. 刪除數據
刪除數據很簡單,只要執行SQL語句中的刪除命令delete即可。
package connectDataBase; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.*; public class deleteData { public static void main(String[] args) { Connection con = null; Statement sta; String code= null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy","",""); code = getInput("請輸入要刪除的學生編號: "); String sql = "delete from student where code='"+code+"'"; sta =con.createStatement(); int k = sta.executeUpdate(sql); System.out.println("刪除了"+k+"條記錄,編號為:"+code); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } private static String getInput(String str) { String msg=null; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print(str); msg = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return msg; } }
程序運行結果如下:
請輸入要刪除的學生編號: 30 刪除了1條記錄,編號為:30 數據庫關閉!
5. 修改數據
使用SQL語句中的update命令就可以修改數據,下面是個簡單的例子,將所有性別為“男”的記錄改成女。
例5.1 修改數據示例。
package connectDataBase; import java.sql.*; public class updateData { public static void main(String[] args) { Connection con = null; Statement sta; String sql; int k; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy", "", ""); System.out.println("數據庫連接成功!"); sql ="update student set sex='女' where sex='男'"; sta = con.createStatement(); k = sta.executeUpdate(sql); System.out.println("修改了"+k+"條記錄"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } }
程序運行結果如下:
數據庫連接成功!
修改了3條記錄
數據庫關閉!
6. 查詢數據
利用SELECT語句查詢得到結果后,會將結果放在一個ResultSet集中,遍歷這個集合就可以做任何需要的操作。
例6.1 先用SQL查詢獲取一個結果集,然后遍歷這個結果集,將其中的記錄輸出到屏幕。
package connectDataBase; import java.sql.*; public class queryData { public static void main(String[] args) { Connection con = null; Statement sta; ResultSet rs; String code,name,sex,address,room,tel; String sql; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:forStudy","",""); System.out.println("數據庫連接成功!"); sta = con.createStatement(); sql = "select * from student"; rs = sta.executeQuery(sql); while(rs.next()){ code = rs.getString("code"); name = rs.getString("name"); sex = rs.getString("sex"); address = rs.getString("address"); room = rs.getString("room"); tel = rs.getString("tel"); System.out.println(code+" "+name+""+sex+" "+address+" "+room+" "+tel); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null){ try { if(!con.isClosed()) con.close(); System.out.println("數據庫關閉!"); } catch (SQLException e) { e.printStackTrace(); } } } } }
程序運行結果如下:
數據庫連接成功! 0001 陳永華女 湖南長沙 N-405 13107311256 0012 李明女 湖南株洲 S-102 8945211 0013 張三女 河南鄭州 A-527 8723641 數據庫關閉!
在上述程序中,需要先將游標執行一次next()方法,才能讀取數據。這是因為游標開始的時候位於第一條記錄的前面。
7. 學生信息管理系統實例
程序代碼如下:
import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.*; import javax.swing.*; public class AddressList extends WindowAdapter implements ActionListener { JFrame jf; Container con; JPanel jp[]; JTextField jtf[]; JLabel jl[]; JButton firstBtn,preBtn,nextBtn,lastBtn,addBtn,editBtn,delBtn,cancelBtn,saveBtn,searchBtn; Connection conn = null; Statement sta = null; ResultSet rs = null; protected int recordState = onlyRead, curRow = 0, recordCnt = 0; public static final int onlyRead = 0, adding = 1, amending = 2; public static final String lblmsg[]={"學生姓名","學籍號","身份證件號","性別","籍貫","民族", "家庭住址","學校名稱","學校標識碼","年級","班級","聯系電話"}; private static final int fieldCnt = 12; //在構造方法中構造界面 public AddressList(){ jf = new JFrame("學籍信息管理系統"); con = jf.getContentPane(); con.setLayout(new BoxLayout(con,BoxLayout.Y_AXIS)); jp = new JPanel[7]; for(int i=0;i<7;i++){ jp[i] = new JPanel(); jp[i].setLayout(new FlowLayout()); } jtf = new JTextField[fieldCnt]; jl = new JLabel[fieldCnt]; for(int i=0;i<fieldCnt;i++){ jtf[i] = new JTextField(); jtf[i].setColumns(36); jtf[i].setEditable(false); jl[i] = new JLabel(); jl[i].setText(lblmsg[i]); jp[i/2].add(jl[i]); jp[i/2].add(jtf[i]); } firstBtn = new JButton("第一條"); firstBtn.addActionListener(this); preBtn = new JButton("上一條"); preBtn.addActionListener(this); nextBtn = new JButton("下一條"); nextBtn.addActionListener(this); lastBtn = new JButton("最后一條"); lastBtn.addActionListener(this); addBtn = new JButton("增加記錄"); addBtn.addActionListener(this); editBtn = new JButton("編輯記錄"); editBtn.addActionListener(this); delBtn = new JButton("刪除記錄"); delBtn.addActionListener(this); cancelBtn = new JButton("取消改變"); cancelBtn.addActionListener(this); saveBtn = new JButton("保存記錄"); saveBtn.addActionListener(this); searchBtn = new JButton("查找記錄"); //按身份證號查找 searchBtn.addActionListener(this); jp[6].add(firstBtn); jp[6].add(preBtn); jp[6].add(nextBtn); jp[6].add(lastBtn); jp[6].add(addBtn); jp[6].add(editBtn); jp[6].add(delBtn); jp[6].add(cancelBtn); jp[6].add(saveBtn); jp[6].add(searchBtn); for(int i=0;i<7;i++) con.add(jp[i]); jf.setSize(1000, 400); jf.setLocation(300, 200); // jf.setResizable(false); jf.setVisible(true); jf.addWindowListener(this); connection(); if(recordCnt>0) showData(); setFace(); } //打開數據庫 public void connection() { // String path = this.getClass().getClassLoader().getResource("db/Student.mdb").getPath().substring(1); String path = "D:\\Student.mdb"; String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+path; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // conn = DriverManager.getConnection("jdbc:odbc:Student", "", ""); conn = DriverManager.getConnection(url, "", ""); sta = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); rs = sta.executeQuery("select count(*) from student"); if(rs.next()) recordCnt = rs.getInt(1); //獲取記錄數 rs = sta.executeQuery("select * from student"); rs.next(); //將游標移動到第一條記錄處 curRow = 1; } catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(jf, "無法加載ODBC驅動"); } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "數據庫無法連接或沒有記錄"); } } //設置按鈕的初始狀態 protected void setFace(){ firstBtn.setEnabled(false); preBtn.setEnabled(false); nextBtn.setEnabled(true); lastBtn.setEnabled(true); addBtn.setEnabled(true); editBtn.setEnabled(true); delBtn.setEnabled(true); cancelBtn.setEnabled(false); saveBtn.setEnabled(false); } //退出系統時關閉數據庫 public void windowClosing(WindowEvent e1){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } finally { System.exit(0); } } //依次在text中顯示學生學籍信息(顯示數據到控件中) public void showData(){ try { jtf[0].setText(rs.getString("name")); jtf[1].setText(rs.getString("stuID")); jtf[2].setText(rs.getString("IC")); jtf[3].setText(rs.getString("sex")); jtf[4].setText(rs.getString("native")); jtf[5].setText(rs.getString("nation")); jtf[6].setText(rs.getString("address")); jtf[7].setText(rs.getString("schname")); jtf[8].setText(rs.getString("schnum")); jtf[9].setText(rs.getString("grade")); jtf[10].setText(rs.getString("class")); jtf[11].setText(rs.getString("tel")); } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "無法獲取數據"); } } //幾個輔助方法(供按鈕調用) protected void setTextState(boolean flag){ //設置文本讀寫狀態 for(int i=0;i<fieldCnt;i++) jtf[i].setEditable(flag); } protected void setTextEmpty(){ //將所有文本框中的數據清除 for(int i=0;i<fieldCnt;i++) jtf[i].setText(null); jtf[5].setText("漢族"); jtf[7].setText("確山縣任店鎮第二初級中學"); jtf[8].setText("3141002842"); } //"第一條"按鈕事件響應代碼 protected void doMoveFirst(){ //容錯處理 if(curRow<=1){ firstBtn.setEnabled(false); preBtn.setEnabled(false); curRow = 1; return; } try { if(rs.first()){ //移動游標到第一條記錄 showData(); //顯示當前記錄到界面上 curRow = 1; //記錄游標的新位置 //重新設置按鈕狀態 firstBtn.setEnabled(false); preBtn.setEnabled(false); nextBtn.setEnabled(true); lastBtn.setEnabled(true); } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "移動游標出錯"); } } //"上一條"按鈕事件響應代碼 protected void doMovePrevior(){ if(curRow<=1){ firstBtn.setEnabled(false); preBtn.setEnabled(false); curRow = 1; return; } try { if(rs.previous()){ //向前移動游標 showData(); curRow--; if(curRow==1){ //如果是第一條記錄 firstBtn.setEnabled(false); preBtn.setEnabled(false); } nextBtn.setEnabled(true); lastBtn.setEnabled(true); } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "移動游標出錯"); } } //"下一條"按鈕事件響應代碼 protected void doMoveNext(){ if(curRow>=recordCnt){ //容錯處理 nextBtn.setEnabled(false); lastBtn.setEnabled(false); curRow=recordCnt; return; } try { if(rs.next()){ //向后移動游標 showData(); curRow++; if(curRow==recordCnt){ nextBtn.setEnabled(false); lastBtn.setEnabled(false); } firstBtn.setEnabled(true); preBtn.setEnabled(true); } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "移動游標出錯"); } } //"最后一條"按鈕事件響應代碼 protected void doMoveLast() { if(curRow>=recordCnt){ //容錯處理 nextBtn.setEnabled(false); lastBtn.setEnabled(false); curRow=1; return; } try{ if(rs.last()){ //將游標移動到最后 showData(); curRow=recordCnt; nextBtn.setEnabled(false); lastBtn.setEnabled(false); firstBtn.setEnabled(true); preBtn.setEnabled(true); } } catch(SQLException e) { JOptionPane.showMessageDialog(jf, "移動游標出錯"); } } //增加記錄按鈕事件響應代碼 protected void doAdd() { if(recordState==onlyRead){ //原先是瀏覽狀態,現在切換到編輯狀態 firstBtn.setEnabled(false); preBtn.setEnabled(false); nextBtn.setEnabled(false); lastBtn.setEnabled(false); addBtn.setEnabled(true); editBtn.setEnabled(false); delBtn.setEnabled(false); cancelBtn.setEnabled(true); saveBtn.setEnabled(true); recordState=adding; setTextState(true); //將各個Text置為可寫 setTextEmpty(); //將各個Text置空,准備編輯記錄 }else { //原先就是編輯狀態 if(doSave(false)) //先保存上次增加的記錄 setTextEmpty(); //如果保存成功,准備增加下一條記錄 } } //保存記錄按鈕事件響應代碼 protected boolean doSave(boolean goViewState) { try { if(recordState==amending){ //如果是修改狀態 for(int i=0;i<fieldCnt;i++) rs.updateString(i+1, jtf[i].getText()); rs.updateRow(); //更新當前記錄 goViewState = true; //准備切換到瀏覽狀態 }else if(recordState==adding) { //這是增加狀態 //將游標移動到准備插入的地方 rs.moveToInsertRow(); //下面3步是插入記錄必備的 for(int i=0;i<fieldCnt;i++) rs.updateString(i+1, jtf[i].getText()); rs.insertRow(); recordCnt++; //修改記錄數 curRow=recordCnt; //移動標志 rs.last(); //將游標移動到最后,也就是插入記錄的位置 } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "保存數據不成功!"); return false; } if(goViewState){ //要切換回瀏覽狀態 firstBtn.setEnabled(true); preBtn.setEnabled(true); nextBtn.setEnabled(false); lastBtn.setEnabled(false); addBtn.setEnabled(true); editBtn.setEnabled(true); delBtn.setEnabled(true); cancelBtn.setEnabled(false); saveBtn.setEnabled(false); recordState=onlyRead; setTextState(false); } return true; } //編輯記錄按鈕事件響應代碼 protected void doEdit(){ if(0==recordCnt) return; //如果記錄數為零,則不可能修改 //開始設置按鈕的狀態 firstBtn.setEnabled(false); preBtn.setEnabled(false); nextBtn.setEnabled(false); lastBtn.setEnabled(false); addBtn.setEnabled(false); editBtn.setEnabled(false); delBtn.setEnabled(false); cancelBtn.setEnabled(true); saveBtn.setEnabled(true); recordState = amending; //置為修改狀態 setTextState(true); } //取消改變按鈕事件響應代碼 protected void doCancel(){ if(recordCnt==0) return; try { rs.absolute(curRow); //移動到原先記錄處 showData(); //設置按鈕狀態 if(curRow>1){ firstBtn.setEnabled(true); preBtn.setEnabled(true); } if(curRow<recordCnt){ nextBtn.setEnabled(true); lastBtn.setEnabled(true); } addBtn.setEnabled(true); editBtn.setEnabled(true); delBtn.setEnabled(true); cancelBtn.setEnabled(false); saveBtn.setEnabled(false); recordState = onlyRead; setTextState(false); } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "游標移動錯誤"); } } //刪除記錄按鈕事件響應代碼 protected void doDelete(){ if(0==recordCnt) return; //如果沒有記錄,則什么都不用做 if(JOptionPane.showConfirmDialog(jf, "刪除后將不可恢復!確定要刪除當前記錄嗎?","提示",JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION){ try { rs.deleteRow(); //刪除當前記錄 recordCnt--; if(recordCnt>0){ //如果剩余還有記錄 if(curRow>=recordCnt) //如果刪除的是最后一條記錄 curRow=recordCnt; //否則的話,curRow的值無需改變,因為后一條記錄自動成為了當前記錄 rs.absolute(curRow); showData(); }else { curRow = 0; setTextEmpty(); } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "刪除數據出錯"); } } } //查找記錄按鈕事件響應代碼 protected void doSearch(){ boolean b = true;; String IC = JOptionPane.showInputDialog(jf, "請輸入要查找學生的身份證號:"); if(curRow<=1){ firstBtn.setEnabled(false); preBtn.setEnabled(false); curRow = 1; } try { if(rs.first()){ //移動游標到第一條記錄 curRow = 1; //記錄游標的新位置 //重新設置按鈕狀態 firstBtn.setEnabled(false); preBtn.setEnabled(false); nextBtn.setEnabled(true); lastBtn.setEnabled(true); } while(b&&IC!=null){ if(rs.getString("IC").equals(IC)){ try { jtf[0].setText(rs.getString("name")); jtf[1].setText(rs.getString("stuID")); jtf[2].setText(IC); jtf[3].setText(rs.getString("sex")); jtf[4].setText(rs.getString("native")); jtf[5].setText(rs.getString("nation")); jtf[6].setText(rs.getString("address")); jtf[7].setText(rs.getString("schname")); jtf[8].setText(rs.getString("schnum")); jtf[9].setText(rs.getString("grade")); jtf[10].setText(rs.getString("class")); jtf[11].setText(rs.getString("tel")); } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "無法獲取數據"); } return; }else{ if(curRow>=recordCnt){ curRow=recordCnt; b = false; JOptionPane.showMessageDialog(jf, "數據庫中沒找到該記錄!"); } else{ if(rs.next()){ //向后移動游標 curRow++; if(curRow==recordCnt){ nextBtn.setEnabled(false); lastBtn.setEnabled(false); } firstBtn.setEnabled(true); preBtn.setEnabled(true); } } } } } catch (SQLException e) { JOptionPane.showMessageDialog(jf, "移動游標出錯"); } } //actionPerformed()方法 public void actionPerformed(ActionEvent e){ Object obj; obj = e.getSource(); if(obj == firstBtn){ doMoveFirst(); }else if(obj == preBtn){ doMovePrevior(); }else if(obj == nextBtn){ doMoveNext(); }else if(obj==lastBtn){ doMoveLast(); }else if(obj==addBtn){ doAdd(); }else if(obj==saveBtn){ doSave(true); }else if(obj==editBtn){ doEdit(); }else if(obj==cancelBtn){ doCancel(); }else if(obj==delBtn){ doDelete(); }else if(obj==searchBtn){ doSearch(); } } public static void main(String[] args){ new AddressList(); } }