zoukankan      html  css  js  c++  java
  • JAVA入门到精通-第72讲-学生管理系统4-model 2模式(1)

    删除、查询、添加、修改:
    -修改:
    每个字段都可能修改:


    //给?赋值
    //在prepareStatement语句后面赋值才好用


    //修改完了,更新数据


    目前为止,已经完成了增删改查-Model1模式
    最大特点:
    界面和业务逻辑操作是放在一起的;
    优点:简单,开发方便;

    缺点:代码复用性不高;
    中大型项目可读性差,可维护性不高;
    前台后端混杂在一起的;
    比如:“数据库密码换了,
    所有涉及到数据库的地方都需要发生变化”
    =================================
    =================================
    Model2模式:界面和操作分离
    思想是最重要的;
    数据库的操作全部交给StuModel处理;
    对数据库的维护比较方便,比如数据库的密码,地址变化了,
    就改动数据模型StuModel就可以了;

    -简单的model2模式
    界面(view)和模型(model/后台/业务逻辑层)
    最大特点:界面和后台操作是分离的;
    优点:代码复用性好、可读性高、可维护性好;
    缺点:相对来说比较复杂;

    //添加学生
    默认是添加成功的

    可以把数据库的地址、用户名、密码作为成员变量,
    传参数进去,这样方便日后的修改;
    以后更换数据库比较方便;

    可以通过字符串数组String []paras 方式把参数传进来
    i+1,传进来的参数是从0开始编号的;



    //弹出消息框JOptionPane.showMessageDialog(this,"添加失败");
    //关闭对话框
    this.dispose();

    ---------------------
    -删除,把增删改全部写在“添加学生”模块
    -public boolean updStu
    -修改

    ==============
    -专门做一个函数,得到数据:
    不要让构造函数和得到数据混在一起;



    在不知道的情况下,对数据库进行了一次查询

    [JTable_Test3.java]源码

    156
    156
     
    1
    /**
    2
     * 完成一个mini版本的学生管理系统(MODEL2模式)
    3
     * 1、查询任务
    4
     * 2、添加功能
    5
     */
    6
    package com.student2;
    7
     
    8
    import java.awt.event.ActionEvent;
    9
    import java.awt.event.ActionListener;
    10
    import java.sql.Connection;
    11
    import java.sql.DriverManager;
    12
    import java.sql.PreparedStatement;
    13
    import java.sql.ResultSet;
    14
    import java.sql.SQLException;
    15
    import java.util.Vector;
    16
    import javax.swing.*;
    17
    import javax.swing.table.AbstractTableModel;
    18
     
    19
    public class JTable_Test3 extends JFrame implements ActionListener{
    20
        //定义组件
    21
        JPanel jp1,jp2;
    22
        JLabel jl1;
    23
        JButton jb1,jb2,jb3,jb4;
    24
        JTable jt;
    25
        JScrollPane jsp;
    26
        JTextField jtf;
    27
        StuModel sm;
    28
       
    29
        public static void main(String[] args) {
    30
            try {
    31
                // 将当前窗体外观设置为所在操作系统的外观
    32
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    33
            } catch (ClassNotFoundException e) {
    34
                e.printStackTrace();
    35
            } catch (InstantiationException e) {
    36
                e.printStackTrace();
    37
            } catch (IllegalAccessException e) {
    38
                e.printStackTrace();
    39
            } catch (UnsupportedLookAndFeelException e) {
    40
                e.printStackTrace();
    41
            }
    42
            new JTable_Test3();
    43
        }
    44
       
    45
        //构造函数
    46
        public JTable_Test3(){
    47
            jp1=new JPanel();
    48
            jtf=new JTextField(10);
    49
            jb1=new JButton("查询");
    50
            jb1.addActionListener(this);
    51
            jl1=new JLabel("请输入名字");
    52
           
    53
            //把各个空间加入列
    54
            jp1.add(jl1);
    55
            jp1.add(jtf);
    56
            jp1.add(jb1);
    57
            jp2=new JPanel();
    58
            jb2=new JButton("添加");
    59
            jb2.addActionListener(this);
    60
            jb3=new JButton("修改");
    61
            jb3.addActionListener(this);
    62
            jb4=new JButton("删除");
    63
            jb4.addActionListener(this);
    64
           
    65
            //把各个按钮加入到jp2中
    66
            jp2.add(jb2);
    67
            jp2.add(jb3);
    68
            jp2.add(jb4);
    69
           
    70
            //创建一个数据模型对象
    71
            sm=new StuModel();
    72
           
    73
            //初始化JTable
    74
            jt=new JTable(sm);
    75
           
    76
            //初始化jsp JScrollPane
    77
            jsp=new JScrollPane(jt);
    78
           
    79
            //把jsp放入到jframe
    80
            this.add(jsp);
    81
            this.add(jp1,"North");
    82
            this.add(jp2,"South");
    83
           
    84
            this.setSize(400, 300);
    85
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    86
            this.setVisible(true);
    87
        }
    88
     
    89
        public void actionPerformed(ActionEvent e) {
    90
            if(e.getSource()==jb1){
    91
                //因为把对表的数据封装到StuModel中,我们就可以比较简单的完成查询
    92
                String name=this.jtf.getText();
    93
                //写一个SQL语句
    94
                String sql="select * from stu where stuName='"+name+"'";
    95
                //构建新的数据模型类,并更新
    96
                sm=new StuModel(sql);
    97
                //更新JTable
    98
                jt.setModel(sm);
    99
            }
    100
            //用户点击添加时
    101
            else if(e.getSource()==jb2){
    102
                StuAddDialog sa=new StuAddDialog(this, "添加学生", true);
    103
                //重新再获得新的数据模型
    104
                //构建新的数据模型类,并更新
    105
                sm=new StuModel();
    106
                //更新JTable
    107
                jt.setModel(sm);
    108
            }
    109
            //用户修改数据
    110
            else if(e.getSource()==jb3){
    111
                int rowNum=this.jt.getSelectedRow();
    112
                if(rowNum==-1){
    113
                    //提示
    114
                    JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);
    115
                    return;
    116
                }
    117
               
    118
                //显示修改对话框
    119
                new StuUpdDialog(this,"修改学生信息",true,sm,rowNum);
    120
               
    121
                //更新数据模型
    122
                sm=new StuModel();
    123
                //更新JTable
    124
                jt.setModel(sm);
    125
            }
    126
           
    127
            //用户点击删除时,删除一条选中的数据
    128
            else if(e.getSource()==jb4){
    129
                //1、得到学生的ID号
    130
                //getSelectedRow会返回用户点中的行
    131
                //如果该用户一行都没有选择,就会返回-1
    132
                int rowNum=this.jt.getSelectedRow();
    133
                if(rowNum==-1){
    134
                    //提示
    135
                    JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);
    136
                    return;
    137
                }
    138
                //得到学生编号
    139
                String stuId=(String)sm.getValueAt(rowNum, 0);
    140
                //创建一个sql语句
    141
                String sql="delete from stu where stuid=?";
    142
                String []paras={stuId};
    143
                StuModel temp=new StuModel();
    144
                if(temp.updStu(sql, paras)){
    145
                    JOptionPane.showMessageDialog(this,"删除数据成功","删除数据提示",JOptionPane.INFORMATION_MESSAGE);
    146
                }else{
    147
                    JOptionPane.showMessageDialog(this,"删除数据失败","删除数据提示",JOptionPane.ERROR_MESSAGE);
    148
                }
    149
               
    150
                //更新数据模型
    151
                sm=new StuModel();
    152
                //更新JTable
    153
                jt.setModel(sm);
    154
            }
    155
        }
    156
    }

     

    *******************************************************************[StuModel.java]源码

    152
    152
     
    1
    /**
    2
     * 这是一个stu表的模型
    3
     * 可以把对student表的各种操作封装到该模型中
    4
     */
    5
    package com.student2;
    6
     
    7
    import java.sql.Connection;
    8
    import java.sql.DriverManager;
    9
    import java.sql.PreparedStatement;
    10
    import java.sql.ResultSet;
    11
    import java.sql.SQLException;
    12
    import java.util.Vector;
    13
    import javax.swing.JOptionPane;
    14
    import javax.swing.table.AbstractTableModel;
    15
     
    16
    public class StuModel extends AbstractTableModel{
    17
        //rowData用来存放行数据、columnNames存放列名
    18
        Vector rowData,columnNames;
    19
        //定义操作数据库需要的组件
    20
        PreparedStatement ps=null;
    21
        Connection ct=null;
    22
        ResultSet rs=null; 
    23
        String sqlDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    24
        String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;";
    25
       
    26
        //添加学生(增、删、改)
    27
        public boolean updStu(String sql,String []paras){
    28
            boolean b=true;
    29
            try {
    30
                //1、加载驱动
    31
                Class.forName(sqlDriver);
    32
                //2、得到连接
    33
                ct=DriverManager.getConnection(url);
    34
                //3、创建ps
    35
                ps=ct.prepareStatement(sql);
    36
                //给ps的问号赋值
    37
                for(int i=0;i<paras.length;i++){
    38
                    ps.setString(i+1, paras[i]);
    39
                }
    40
               
    41
                //4、执行操作
    42
                if(ps.executeUpdate()!=1){
    43
                    b=false;
    44
                }
    45
               
    46
            } catch (Exception e) {
    47
                b=false;
    48
                JOptionPane.showMessageDialog(null, "数据源错误或数据库用户名、密码错误", "数据库连接错误提示", JOptionPane.ERROR_MESSAGE);
    49
                e.printStackTrace();
    50
            }finally{
    51
                try {
    52
                    if(rs!=null){
    53
                        rs.close();
    54
                    }
    55
                    if(ps!=null){
    56
                        ps.close();
    57
                    }
    58
                    if(ct!=null){
    59
                        ct.close();
    60
                    }
    61
                } catch (SQLException e1) {
    62
                    e1.printStackTrace();
    63
                }
    64
            }
    65
            return b;
    66
        }
    67
       
    68
        public void init(String sql){
    69
            if(sql==""||sql.equals(null)){
    70
                sql="select * from stu";
    71
            }
    72
            //中间
    73
            columnNames=new Vector<>();
    74
            //设置列名
    75
            columnNames.add("学号");
    76
            columnNames.add("名字");
    77
            columnNames.add("性别");
    78
            columnNames.add("年龄");
    79
            columnNames.add("籍贯");
    80
            columnNames.add("系别");
    81
           
    82
            rowData=new Vector<>();
    83
            //rowData可以存放多行
    84
            try {
    85
                //1、加载驱动
    86
                Class.forName(sqlDriver);
    87
                //2、得到连接
    88
                ct=DriverManager.getConnection(url);
    89
               
    90
                ps=ct.prepareStatement(sql);
    91
                rs=ps.executeQuery();
    92
               
    93
                while(rs.next()){
    94
                    Vector hang=new Vector();
    95
                    hang.add(rs.getString(1));
    96
                    hang.add(rs.getString(2));
    97
                    hang.add(rs.getString(3));
    98
                    hang.add(rs.getInt(4));
    99
                    hang.add(rs.getString(5));
    100
                    hang.add(rs.getString(6));
    101
                    //加入rowData
    102
                    rowData.add(hang);
    103
                }
    104
            } catch (Exception e) {
    105
                e.printStackTrace();
    106
            }finally{
    107
                try {
    108
                    if(rs!=null){
    109
                        rs.close();
    110
                    }
    111
                    if(ps!=null){
    112
                        ps.close();
    113
                    }
    114
                    if(ct!=null){
    115
                        ct.close();
    116
                    }
    117
                } catch (SQLException e) {
    118
                    // TODO Auto-generated catch block
    119
                    e.printStackTrace();
    120
                }
    121
            }
    122
        }
    123
       
    124
        //构造函数,用于初始我们的数据模型
    125
        public StuModel(String sql){
    126
            this.init(sql);
    127
        }
    128
       
    129
        //构造函数
    130
        public StuModel(){
    131
            this.init("");
    132
        }
    133
     
    134
        //得到共有多少列
    135
        public int getColumnCount() {
    136
            return this.columnNames.size();
    137
        }
    138
       
    139
        public String getColumnName(int column) {
    140
            return (String)this.columnNames.get(column);
    141
        }
    142
     
    143
        //得到共有多少行
    144
        public int getRowCount() {
    145
            return this.rowData.size();
    146
        }
    147
     
    148
        //得到某行某列的数据
    149
        public Object getValueAt(int rowIndex, int columnIndex) {
    150
            return ((Vector)this.rowData.get(rowIndex)).get(columnIndex);
    151
        }
    152
    }

     

    *******************************************************************************

    [StuAddDialog.java]源码

    106
    106
     
    1
    /**
    2
     * 添加数据
    3
     */
    4
    package com.student2;
    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.JOptionPane;
    21
    import javax.swing.JPanel;
    22
    import javax.swing.JTextField;
    23
     
    24
    public class StuAddDialog extends JDialog implements ActionListener{
    25
        //定义我需要的swing组件
    26
        JLabel jl1,jl2,jl3,jl4,jl5,jl6;
    27
        JButton jb1,jb2;
    28
        JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
    29
        JPanel jp1,jp2,jp3;
    30
       
    31
        //owner它的父窗口;title窗口名;model指定是模态窗口,还是非模态
    32
        public StuAddDialog(Frame owner,String title,boolean modal){
    33
            super(owner,title,modal);//调用父类构造方法,达到模式对话框效果
    34
            jl1=new JLabel("学号");
    35
            jl2=new JLabel("名字");
    36
            jl3=new JLabel("性别");
    37
            jl4=new JLabel("年龄");
    38
            jl5=new JLabel("籍贯");
    39
            jl6=new JLabel("系别");
    40
           
    41
            jtf1=new JTextField();
    42
            jtf2=new JTextField();
    43
            jtf3=new JTextField();
    44
            jtf4=new JTextField();
    45
            jtf5=new JTextField();
    46
            jtf6=new JTextField();
    47
           
    48
            jb1=new JButton("添加");
    49
            jb2=new JButton("取消");
    50
           
    51
            jp1=new JPanel();
    52
            jp2=new JPanel();
    53
            jp3=new JPanel();
    54
           
    55
            //设置布局
    56
            jp1.setLayout(new GridLayout(6,1));
    57
            jp2.setLayout(new GridLayout(6,1));
    58
           
    59
            //添加组件
    60
            jp1.add(jl1);
    61
            jp1.add(jl2);
    62
            jp1.add(jl3);
    63
            jp1.add(jl4);
    64
            jp1.add(jl5);
    65
            jp1.add(jl6);
    66
           
    67
            jp2.add(jtf1);
    68
            jp2.add(jtf2);
    69
            jp2.add(jtf3);
    70
            jp2.add(jtf4);
    71
            jp2.add(jtf5);
    72
            jp2.add(jtf6);
    73
           
    74
            jp3.add(jb1);
    75
            jp3.add(jb2);
    76
           
    77
            this.add(jp1,BorderLayout.WEST);
    78
            this.add(jp2,BorderLayout.CENTER);
    79
            this.add(jp3,BorderLayout.SOUTH);
    80
            jb1.addActionListener(this);
    81
            jb2.addActionListener(this);
    82
           
    83
            //展现
    84
            this.setSize(300, 250);
    85
            this.setVisible(true);
    86
        }
    87
     
    88
        public void actionPerformed(ActionEvent e) {
    89
            //用户点击添加按钮后的响应动作
    90
            if(e.getSource()==jb1){
    91
                StuModel temp=new StuModel();
    92
                String sql="insert into stu values(?,?,?,?,?,?)";
    93
                String []paras={jtf1.getText(),jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText()};
    94
                if(!temp.updStu(sql, paras)){
    95
                    JOptionPane.showMessageDialog(this, "添加数据失败", "添加数据提示", JOptionPane.ERROR_MESSAGE);
    96
                }else{
    97
                    JOptionPane.showMessageDialog(this,"添加数据成功","添加数据提示",JOptionPane.INFORMATION_MESSAGE);
    98
                }
    99
                //关闭对话框
    100
                this.dispose();
    101
            }
    102
            else if(e.getSource()==jb2){
    103
                this.dispose();
    104
            }
    105
        }
    106
    }

     

    ******************************************************************

    [StuUpdDialog.java]源码

    x
    118
     
    1
    /**
    2
     * 修改学生信息
    3
     */
    4
    package com.student2;
    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.JOptionPane;
    21
    import javax.swing.JPanel;
    22
    import javax.swing.JTextField;
    23
     
    24
    public class StuUpdDialog extends JDialog implements ActionListener{
    25
        //定义我需要的swing组件
    26
        JLabel jl1,jl2,jl3,jl4,jl5,jl6;
    27
        JButton jb1,jb2;
    28
        JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
    29
        JPanel jp1,jp2,jp3;
    30
       
    31
        //owner它的父窗口;title窗口名;model指定是模态窗口,还是非模态
    32
        public StuUpdDialog(Frame owner,String title,boolean modal,StuModel sm,int rowNum){
    33
            super(owner,title,modal);//调用父类构造方法,达到模式对话框效果
    34
            jl1=new JLabel("学号");
    35
            jl2=new JLabel("名字");
    36
            jl3=new JLabel("性别");
    37
            jl4=new JLabel("年龄");
    38
            jl5=new JLabel("籍贯");
    39
            jl6=new JLabel("系别");
    40
           
    41
            jtf1=new JTextField();
    42
            //初始化数据
    43
            jtf1.setText((String)sm.getValueAt(rowNum, 0));
    44
            //让jtf1不能修改
    45
            jtf1.setEditable(false);
    46
            jtf2=new JTextField();
    47
            jtf2.setText((String)sm.getValueAt(rowNum, 1));
    48
            jtf3=new JTextField();
    49
            jtf3.setText((String)sm.getValueAt(rowNum, 2));
    50
            jtf4=new JTextField();
    51
            jtf4.setText(sm.getValueAt(rowNum, 3).toString());
    52
            jtf5=new JTextField();
    53
            jtf5.setText((String)sm.getValueAt(rowNum, 4));
    54
            jtf6=new JTextField();
    55
            jtf6.setText((String)sm.getValueAt(rowNum, 5));
    56
           
    57
            jb1=new JButton("修改");
    58
            jb2=new JButton("取消");
    59
           
    60
            jp1=new JPanel();
    61
            jp2=new JPanel();
    62
            jp3=new JPanel();
    63
           
    64
            //设置布局
    65
            jp1.setLayout(new GridLayout(6,1));
    66
            jp2.setLayout(new GridLayout(6,1));
    67
           
    68
            //添加组件
    69
            jp1.add(jl1);
    70
            jp1.add(jl2);
    71
            jp1.add(jl3);
    72
            jp1.add(jl4);
    73
            jp1.add(jl5);
    74
            jp1.add(jl6);
    75
           
    76
            jp2.add(jtf1);
    77
            jp2.add(jtf2);
    78
            jp2.add(jtf3);
    79
            jp2.add(jtf4);
    80
            jp2.add(jtf5);
    81
            jp2.add(jtf6);
    82
           
    83
            jp3.add(jb1);
    84
            jp3.add(jb2);
    85
           
    86
            this.add(jp1,BorderLayout.WEST);
    87
            this.add(jp2,BorderLayout.CENTER);
    88
            this.add(jp3,BorderLayout.SOUTH);
    89
           
    90
            jb1.addActionListener(this);
    91
            jb2.addActionListener(this);
    92
           
    93
            //展现
    94
            this.setSize(300, 250);
    95
            this.setVisible(true);
    96
        }
    97
     
    98
        @Override
    99
        public void actionPerformed(ActionEvent e) {
    100
            //用户点击添加按钮后的响应动作
    101
            if(e.getSource()==jb1){
    102
                //做一个sql语句
    103
                String sql="update stu set stuName=?,stuSex=?,stuAge=?,stuJg=?,stuDept=? where stuId=?";
    104
                String []paras={jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText(),jtf1.getText()};
    105
                StuModel temp=new StuModel();
    106
                if(temp.updStu(sql, paras)){
    107
                    JOptionPane.showMessageDialog(this,"修改数据成功","修改数据提示",JOptionPane.INFORMATION_MESSAGE);
    108
                }else{
    109
                    JOptionPane.showMessageDialog(this,"修改数据失败","修改数据提示",JOptionPane.ERROR_MESSAGE);
    110
                }
    111
                this.dispose();
    112
            }
    113
            else if(e.getSource()==jb2){
    114
                this.dispose();
    115
            }
    116
        }
    117
    }
    118





  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10045818.html
Copyright © 2011-2022 走看看