• 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();
        }
    }
  • 相关阅读:
    大道至简伪代码形式读后感
    大道至简读后感
    使用类型转换生成六位验证字符,实现用户输入验证码的功能
    flex弹性布局的基本介绍
    清除浮动的方法以及为什么清除浮动
    :target伪类制作tab选项卡
    div中的内容水平垂直居中
    setTimeout和setInterval的区别以及如何写出效率高的倒计时
    margintop影响父元素定位
    关于页面中弹窗的定位问题
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4259377.html
Copyright © 2020-2023  润新知