Java數據庫編程技術


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();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM