zoukankan      html  css  js  c++  java
  • JAVA入门到精通-第73讲-学生管理系统5-dao.sqlhelper

    -Model2模式
    如果数据模型会很多,怎么办?
    处理业务逻辑的:Model层
    后台又分为:处理业务逻辑和对数据库的操作DAO-data access object
    -决定,再抽象一层出来:数据模型:BO
    -类:SqlHelper:专门对数据库操作,不含业务逻辑:DAO

    -界面层只认业务逻辑类的对象;业务逻辑层认SqlHelper类的对象;
    -每一层的功能不一样;

    --------------------------------------------------------------
    -把对数据库的操作放在SqlHelper类:

    -传sql,传数组
    -把关闭的代码单独拿出来,写成一个函数;





    -查询数据库的操作
    public ResultSet queryExectue(String sql)



    分层的好处:修改某一模块,不影响其他功能模块

    -SqlHelper
    更新

    单态的:始终只有一个连接

    -查询
    查询过后,资源没有关闭



    select *  from  stu  where 1=? ,用?
    没有问号,注入比较麻烦
    让他们都统一起来,又不想多写一个函数

    不需要注入参数
    public ResultSet queryExecute(String sql)

    把数据更新一遍






    -SqlHelper


    ========================================

    [JTable_Test3.java]源码

    168
     
    1
    /**
    2
     * 完成一个mini版本的学生管理系统(MODEL2-2模式)
    3
     * 1、查询任务
    4
     * 2、添加功能
    5
     */
    6
    package com.student3;
    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
           
    58
            jp2=new JPanel();
    59
            jb2=new JButton("添加");
    60
            jb2.addActionListener(this);
    61
            jb3=new JButton("修改");
    62
            jb3.addActionListener(this);
    63
            jb4=new JButton("删除");
    64
            jb4.addActionListener(this);
    65
            //把各个按钮加入到jp2中
    66
            jp2.add(jb2);
    67
            jp2.add(jb3);
    68
            jp2.add(jb4);
    69
           
    70
            //创建一个数据模型对象
    71
            sm=new StuModel();
    72
            String []paras={"1"};
    73
            sm.queryStu("select * from stu where 1=?", paras);
    74
           
    75
            //初始化JTable
    76
            jt=new JTable(sm);
    77
           
    78
            //初始化jsp JScrollPane
    79
            jsp=new JScrollPane(jt);
    80
           
    81
            //把jsp放入到jframe
    82
            this.add(jsp);
    83
            this.add(jp1,"North");
    84
            this.add(jp2,"South");
    85
           
    86
            this.setSize(400, 300);
    87
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    88
            this.setVisible(true);
    89
        }
    90
     
    91
        @Override
    92
        public void actionPerformed(ActionEvent e) {
    93
            if(e.getSource()==jb1){
    94
                //因为把对表的数据封装到StuModel中,我们就可以比较简单的完成查询
    95
                String name=this.jtf.getText();
    96
                //写一个SQL语句
    97
                String sql="select * from stu where stuName=?";
    98
                String []paras={name};
    99
                //构建新的数据模型类,并更新
    100
                sm=new StuModel();
    101
                sm.queryStu(sql, paras);
    102
                //更新JTable
    103
                jt.setModel(sm);
    104
            }
    105
            //用户点击添加时
    106
            else if(e.getSource()==jb2){
    107
                StuAddDialog sa=new StuAddDialog(this, "添加学生", true);
    108
                //重新再获得新的数据模型
    109
                //构建新的数据模型类,并更新
    110
                sm=new StuModel();
    111
                String []paras2={"1"};
    112
                sm.queryStu("select * from stu where 1=?", paras2);
    113
                //更新JTable
    114
                jt.setModel(sm);
    115
            }
    116
            //用户修改数据
    117
            else if(e.getSource()==jb3){
    118
                int rowNum=this.jt.getSelectedRow();
    119
                if(rowNum==-1){
    120
                    //提示
    121
                    JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);
    122
                    return;
    123
                }
    124
               
    125
                //显示修改对话框
    126
                new StuUpdDialog(this,"修改学生信息",true,sm,rowNum);
    127
               
    128
                //更新数据模型
    129
                sm=new StuModel();
    130
                String []paras2={"1"};
    131
                sm.queryStu("select * from stu where 1=?", paras2);
    132
                //更新JTable
    133
                jt.setModel(sm);
    134
            }
    135
           
    136
            //用户点击删除时,删除一条选中的数据
    137
            else if(e.getSource()==jb4){
    138
                //1、得到学生的ID号
    139
                //getSelectedRow会返回用户点中的行
    140
                //如果该用户一行都没有选择,就会返回-1
    141
                int rowNum=this.jt.getSelectedRow();
    142
                if(rowNum==-1){
    143
                    //提示
    144
                    JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);
    145
                    return;
    146
                }
    147
                //得到学生编号
    148
                String stuId=(String)sm.getValueAt(rowNum, 0);
    149
                //创建一个sql语句
    150
                String sql="delete from stu where stuid=?";
    151
                String []paras={stuId};
    152
                StuModel temp=new StuModel();
    153
                if(temp.updStu(sql, paras)){
    154
                    JOptionPane.showMessageDialog(this,"删除数据成功","删除数据提示",JOptionPane.INFORMATION_MESSAGE);
    155
                }else{
    156
                    JOptionPane.showMessageDialog(this,"删除数据失败","删除数据提示",JOptionPane.ERROR_MESSAGE);
    157
                }
    158
               
    159
                //更新数据模型
    160
                sm=new StuModel();
    161
                String []paras2={"1"};
    162
                sm.queryStu("select * from stu where 1=?", paras2);
    163
                //更新JTable
    164
                jt.setModel(sm);
    165
            }
    166
        }
    167
    }
    168
     

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

    [StuModel.java]源码

    84
     
    1
    /**
    2
     * 这是一个stu表的模型
    3
     * 可以把对student表的各种操作封装到该模型中
    4
     */
    5
    package com.student3;
    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
        //添加学生(增、删、改)
    21
        public boolean updStu(String sql,String []paras){
    22
            //创建SqlHelper(如果程序并发性不考虑,可以把SqlHelper做成static)
    23
            SqlHelper sqlHelper=new SqlHelper();
    24
            return sqlHelper.updExecute(sql, paras);
    25
        }
    26
       
    27
        //查询的本质就是用来初始化
    28
        public void queryStu(String sql,String []paras){
    29
            SqlHelper sqlHelper=null;
    30
            //中间
    31
            columnNames=new Vector<>();
    32
            //设置列名
    33
            columnNames.add("学号");
    34
            columnNames.add("名字");
    35
            columnNames.add("性别");
    36
            columnNames.add("年龄");
    37
            columnNames.add("籍贯");
    38
            columnNames.add("系别");
    39
           
    40
            rowData=new Vector<>();
    41
            //rowData可以存放多行
    42
            try {
    43
                sqlHelper=new SqlHelper();
    44
                ResultSet rs=sqlHelper.queryExectue(sql, paras);
    45
               
    46
                while(rs.next()){
    47
                    Vector hang=new Vector();
    48
                    hang.add(rs.getString(1));
    49
                    hang.add(rs.getString(2));
    50
                    hang.add(rs.getString(3));
    51
                    hang.add(rs.getInt(4));
    52
                    hang.add(rs.getString(5));
    53
                    hang.add(rs.getString(6));
    54
                    //加入rowData
    55
                    rowData.add(hang);
    56
                }
    57
            } catch (Exception e) {
    58
                e.printStackTrace();
    59
            }finally{
    60
                sqlHelper.close();
    61
            }
    62
        }
    63
       
    64
        //得到共有多少列
    65
        public int getColumnCount() {
    66
            return this.columnNames.size();
    67
        }
    68
       
    69
        @Override
    70
        public String getColumnName(int column) {
    71
            return (String)this.columnNames.get(column);
    72
        }
    73
     
    74
        //得到共有多少行
    75
        public int getRowCount() {
    76
            return this.rowData.size();
    77
        }
    78
     
    79
        //得到某行某列的数据
    80
        public Object getValueAt(int rowIndex, int columnIndex) {
    81
            return ((Vector)this.rowData.get(rowIndex)).get(columnIndex);
    82
        }
    83
    }
    84
     

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

    [SqlHelper.java]源码

    106
     
    1
    /**
    2
     * 这是一个对数据库进行操作的类(SqlHelper)
    3
     */
    4
    package com.student3;
    5
     
    6
    import java.sql.Connection;
    7
    import java.sql.DriverManager;
    8
    import java.sql.PreparedStatement;
    9
    import java.sql.ResultSet;
    10
    import java.sql.SQLException;
    11
    import javax.swing.JOptionPane;
    12
     
    13
    public class SqlHelper {
    14
        //定义操作数据库需要的组件
    15
        PreparedStatement ps=null;
    16
        Connection ct=null;
    17
        ResultSet rs=null; 
    18
        String sqlDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    19
        String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;";
    20
       
    21
        public SqlHelper(){
    22
            try {
    23
                //1、加载驱动
    24
                Class.forName(sqlDriver);
    25
                //2、得到连接
    26
                ct=DriverManager.getConnection(url);
    27
            } catch (Exception e) {
    28
                e.printStackTrace();
    29
            }
    30
        }
    31
       
    32
        //关闭数据库资源
    33
        public void close(){
    34
            try {
    35
                if(rs!=null){
    36
                    rs.close();
    37
                }
    38
                if(ps!=null){
    39
                    ps.close();
    40
                }
    41
                if(ct!=null){
    42
                    ct.close();
    43
                }
    44
            } catch (SQLException e1) {
    45
                e1.printStackTrace();
    46
            }
    47
        }
    48
       
    49
        //写一个不需要注入的方法(由于数据量少,所以写了一个这个方法。一般都带有条件的注入)
    50
        public ResultSet queryExectue(String sql){
    51
            try {
    52
                //3、创建ps
    53
                ps=ct.prepareStatement(sql);
    54
                rs=ps.executeQuery();
    55
            } catch (Exception e) {
    56
                e.printStackTrace();
    57
            }finally{
    58
                //关闭资源???
    59
            }
    60
            return rs;
    61
        }
    62
       
    63
        //对数据库的查询操作
    64
        public ResultSet queryExectue(String sql,String []paras){
    65
            try {
    66
                //3、创建ps
    67
                ps=ct.prepareStatement(sql);
    68
                //给ps的问号赋值
    69
                for(int i=0;i<paras.length;i++){
    70
                    ps.setString(i+1, paras[i]);
    71
                }
    72
               
    73
                rs=ps.executeQuery();
    74
            } catch (Exception e) {
    75
                e.printStackTrace();
    76
            }finally{
    77
                //关闭资源???
    78
            }
    79
            return rs;
    80
        }
    81
       
    82
        //把对数据库的增、删、改合在一起
    83
        public boolean updExecute(String sql,String []paras){
    84
            boolean b=true;
    85
            try {
    86
                //3、创建ps
    87
                ps=ct.prepareStatement(sql);
    88
                //给ps的问号赋值
    89
                for(int i=0;i<paras.length;i++){
    90
                    ps.setString(i+1, paras[i]);
    91
                }
    92
               
    93
                //4、执行操作
    94
                if(ps.executeUpdate()!=1){
    95
                    b=false;
    96
                }
    97
            } catch (Exception e) {
    98
                b=false;
    99
                JOptionPane.showMessageDialog(null, "数据源错误或数据库用户名、密码错误", "数据库连接错误提示", JOptionPane.ERROR_MESSAGE);
    100
                e.printStackTrace();
    101
            }finally{
    102
                this.close();
    103
            }
    104
            return b;
    105
        }
    106
    }

     

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

    [StuAddDialog.java]源码

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

     

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

    [StuUpdDialog.java]源码

    125
     
    1
    /**
    2
     * 修改学生信息
    3
     */
    4
    package com.student3;
    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





  • 相关阅读:
    C# Socket 入门2(转)
    C# Socket 入门1(转)
    StructLayout特性(转)
    [转载]U3d常规性能优化技巧
    Python语言系统学习(七)
    Python语言系统学习(五)
    python语言系统学习(六)
    python语言系统学习(四)
    白话经典算法-常见排序算法的实现与性能比较
    最快的内容查找算法-----暴雪的Hash算法
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10045826.html
Copyright © 2011-2022 走看看