打赏

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





posted on 2018-11-30 18:20  XuCodeX  阅读(251)  评论(0编辑  收藏  举报

导航