zoukankan      html  css  js  c++  java
  • JAVA入门到精通-第71讲-学生管理系统3-增删改查

    模式的概念(mv):
    提高系统的可读性、可维护性、效率;
     ---------------------
    添加、修改、删除
    //添加的界面做好了
    //对添加的按钮做个响应,直接操作数据库;
    //完全可以满足添加的这个任务的

    //重新获得数据模型,更新

    //删除数据
    JTable删除,最关键是拿到“学号“,唯一标识信息

    //画个程序的结构图,写代码会容易点
    程序框架图:
    描述程序中的文件以及各个文件之间的关系
    StuManage    主界面
    StuModel       数据模型
    StuAddDialog添加学生界面
    -查询,中间借助了StuModel,有互相使用关系
    -删除,在主界面产生
    -删除:拿到拿到ID:这一行的第一列
    //getSelectedRow() 会返回用户点中的行
    //如果该用户一行都没选择,会返回-1;

    //消息框
    this-在这个窗口跳出的
    JOptionPane.showMessageDialog(this,  xxx);
    return:返回主调函数的下一行;
    谁调用就返回给谁

    不是-1,得到学生编号:

    //学生模型对象StuModel是作为局部变量的,不够合理
    存在内存泄露的问题;

    多个sm,用完并没有关闭,前面那个用完之后
    虽然没有用了,但仍然会有引用指向它;

    内存泄露:
    如果一个数据对象有一个引用指向它,
    但你在程序当中又没有用它,(查询完的sm)
    这样的话,垃圾回收机制是回收不了这个对象的;
    成为一个内存泄露;

    查询完的sm指向堆区,
    但是主栈的sm没有回收,始终指向堆区;
    垃圾回收机制认为主栈里面还有一个引用
    指向堆区的;实际上已经没有用;
    这就,内存泄露了。

    本身就是很危险的;
    ----------------
    解决方法:把数据模型做成成员变量;

    始终这个栈区指向只有一个sm
    只是根据数据库的查询不停地更新;


    强转为string



    //连接数据库,完成删除任务



    -修改Update:
    StuUpdDialog
    能让用户输入新的数据;
    -StuUpdDialog

    -数据应该是从主界面传过来的

    引用传递,把模型StuModel sm,
    和行数据rowNums传过来;

    直接从模型里面传过来就行;
    耦合性越高,代码越烂,
    尽可能通过引用传递、来传递数据;

    //修改数据

    局部变量“就近原则”
    ClassCastException 类型转换出错:
    这里不允许把Integer强制转化为String

    toString进行转换

    //让jtff1不能修改
    jtf1.setEditable(false);


    [StuUpdDialog.java]源码

     
    1
    /**
    2
     * 修改学生信息
    3
     */
    4
    package com.student1;
    5
     
    6
    import java.awt.BorderLayout;
    7
    import java.awt.Frame;
    8
    import java.awt.GridLayout;
    9
    import java.awt.event.ActionEvent;
    10
    import java.awt.event.ActionListener;
    11
    import java.sql.Connection;
    12
    import java.sql.DriverManager;
    13
    import java.sql.PreparedStatement;
    14
    import java.sql.ResultSet;
    15
    import java.sql.SQLException;
    16
    import java.sql.Statement;
    17
    import javax.swing.JButton;
    18
    import javax.swing.JDialog;
    19
    import javax.swing.JLabel;
    20
    import javax.swing.JPanel;
    21
    import javax.swing.JTextField;
    22
     
    23
    public class StuUpdDialog extends JDialog implements ActionListener{
    24
        //定义我需要的swing组件
    25
        JLabel jl1,jl2,jl3,jl4,jl5,jl6;
    26
        JButton jb1,jb2;
    27
        JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
    28
        JPanel jp1,jp2,jp3;
    29
       
    30
        //owner它的父窗口;title窗口名;model指定是模态窗口,还是非模态
    31
        public StuUpdDialog(Frame owner,String title,boolean modal,StuModel sm,int rowNum){
    32
            super(owner,title,modal);//调用父类构造方法,达到模式对话框效果
    33
            jl1=new JLabel("学号");
    34
            jl2=new JLabel("名字");
    35
            jl3=new JLabel("性别");
    36
            jl4=new JLabel("年龄");
    37
            jl5=new JLabel("籍贯");
    38
            jl6=new JLabel("系别");
    39
           
    40
            jtf1=new JTextField();
    41
            //初始化数据
    42
            jtf1.setText((String)sm.getValueAt(rowNum, 0));
    43
            //让jtf1不能修改
    44
            jtf1.setEditable(false);
    45
            jtf2=new JTextField();
    46
            jtf2.setText((String)sm.getValueAt(rowNum, 1));
    47
            jtf3=new JTextField();
    48
            jtf3.setText((String)sm.getValueAt(rowNum, 2));
    49
            jtf4=new JTextField();
    50
            jtf4.setText(sm.getValueAt(rowNum, 3).toString());
    51
            jtf5=new JTextField();
    52
            jtf5.setText((String)sm.getValueAt(rowNum, 4));
    53
            jtf6=new JTextField();
    54
            jtf6.setText((String)sm.getValueAt(rowNum, 5));
    55
           
    56
            jb1=new JButton("修改");
    57
            jb2=new JButton("取消");
    58
           
    59
            jp1=new JPanel();
    60
            jp2=new JPanel();
    61
            jp3=new JPanel();
    62
           
    63
            //设置布局
    64
            jp1.setLayout(new GridLayout(6,1));
    65
            jp2.setLayout(new GridLayout(6,1));
    66
           
    67
            //添加组件
    68
            jp1.add(jl1);
    69
            jp1.add(jl2);
    70
            jp1.add(jl3);
    71
            jp1.add(jl4);
    72
            jp1.add(jl5);
    73
            jp1.add(jl6);
    74
           
    75
            jp2.add(jtf1);
    76
            jp2.add(jtf2);
    77
            jp2.add(jtf3);
    78
            jp2.add(jtf4);
    79
            jp2.add(jtf5);
    80
            jp2.add(jtf6);
    81
           
    82
            jp3.add(jb1);
    83
            jp3.add(jb2);
    84
           
    85
            this.add(jp1,BorderLayout.WEST);
    86
            this.add(jp2,BorderLayout.CENTER);
    87
            this.add(jp3,BorderLayout.SOUTH);
    88
           
    89
            jb1.addActionListener(this);
    90
            jb2.addActionListener(this);
    91
           
    92
            //展现
    93
            this.setSize(300, 250);
    94
            this.setVisible(true);
    95
        }
    96
     
    97
        public void actionPerformed(ActionEvent e) {
    98
            //用户点击添加按钮后的响应动作
    99
            if(e.getSource()==jb1){
    100
                //连接数据库
    101
                Connection ct=null;
    102
                Statement stmt=null;
    103
                ResultSet rs=null;
    104
                PreparedStatement ps=null;
    105
                //连接数据库
    106
                try {
    107
                    //1、加载驱动
    108
                    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    109
                    //2、得到连接
    110
                      ct=DriverManager.getConnection
    111
                           ("jdbc:sqlserver://127.0.0.1:1433;
    112
                            databaseName=stussystem;user=sa;password=sa;");
    113
                   
    114
                    String strsql="update stu set stuName=?,stuSex=?,stuAge=?,
    115
                            stuJg=?,stuDept=? where stuId=?";
    116
                    ps=ct.prepareStatement(strsql);
    117
                    ps.setString(1,jtf2.getText());
    118
                    ps.setString(2,jtf3.getText());
    119
                    ps.setInt(3,Integer.parseInt(jtf4.getText()));
    120
                    ps.setString(4,jtf5.getText());
    121
                    ps.setString(5,jtf6.getText());
    122
                    ps.setString(6, jtf1.getText());
    123
                    ps.executeUpdate();
    124
                    this.dispose();
    125
                } catch (Exception e2) {
    126
                    e2.printStackTrace();
    127
                }finally{
    128
                    try {
    129
                        if(ps!=null){
    130
                            ps.close();
    131
                        }
    132
                        if(ct!=null){
    133
                            ct.close();
    134
                        }
    135
                    } catch (SQLException e1) {
    136
                        e1.printStackTrace();
    137
                    }
    138
                }
    139
            }
    140
            else if(e.getSource()==jb2){
    141
                this.dispose();
    142
            }
    143
        }
    144
    }
    145
     





  • 相关阅读:
    使用Graphics合成带二维码和头像的分享图(小程序分享、App分享)
    04_关键字的作用
    03_线程
    02_进程
    01_命名规范
    WebApi的创建,部署,Oauth身份认证(三)
    WebApi的创建,部署,Oauth身份认证(二)
    WebApi的创建,部署,Oauth身份认证(一)
    Prism.Interactivity 和 Prism.Modularity 介绍
    Prism BindableBase 和 Commands 的介绍
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10045808.html
Copyright © 2011-2022 走看看