JAVA入门到精通-第73讲-学生管理系统5-dao.sqlhelper

Posted 夏至稻花如白练,大暑池畔赏红莲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;