时间:2021-07-01 10:21:17 帮助过:16人阅读









查询过后,资源没有关闭


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




[JTable_Test3.java]源码
168 1/**2 * 完成一个mini版本的学生管理系统(MODEL2-2模式)3 * 1、查询任务4 * 2、添加功能5 */6package com.student3;7 8import java.awt.event.ActionEvent;9import java.awt.event.ActionListener;10import java.sql.Connection;11import java.sql.DriverManager;12import java.sql.PreparedStatement;13import java.sql.ResultSet;14import java.sql.SQLException;15import java.util.Vector;16import javax.swing.*;17import javax.swing.table.AbstractTableModel;18 19public 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 //初始化JTable76 jt=new JTable(sm);77 78 //初始化jsp JScrollPane79 jsp=new JScrollPane(jt);80 81 //把jsp放入到jframe82 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 @Override92 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 //更新JTable103 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 //更新JTable114 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 //更新JTable133 jt.setModel(sm);134 }135 136 //用户点击删除时,删除一条选中的数据137 else if(e.getSource()==jb4){138 //1、得到学生的ID号139 //getSelectedRow会返回用户点中的行140 //如果该用户一行都没有选择,就会返回-1141 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 //更新JTable164 jt.setModel(sm);165 }166 }167}168 *******************************************************************************
[StuModel.java]源码
84 1/**2 * 这是一个stu表的模型3 * 可以把对student表的各种操作封装到该模型中4 */5package com.student3;6 7import java.sql.Connection;8import java.sql.DriverManager;9import java.sql.PreparedStatement;10import java.sql.ResultSet;11import java.sql.SQLException;12import java.util.Vector;13import javax.swing.JOptionPane;14import javax.swing.table.AbstractTableModel;15 16public 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 //加入rowData55 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 @Override70 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 */4package com.student3;5 6import java.sql.Connection;7import java.sql.DriverManager;8import java.sql.PreparedStatement;9import java.sql.ResultSet;10import java.sql.SQLException;11import javax.swing.JOptionPane;12 13public 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、创建ps53 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、创建ps67 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、创建ps87 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 1package com.student3;2 3import java.awt.BorderLayout;4import java.awt.Frame;5import java.awt.GridLayout;6import java.awt.event.ActionEvent;7import java.awt.event.ActionListener;8import java.sql.Connection;9import java.sql.DriverManager;10import java.sql.PreparedStatement;11import java.sql.ResultSet;12import java.sql.SQLException;13import java.sql.Statement;14import javax.swing.JButton;15import javax.swing.JDialog;16import javax.swing.JLabel;17import javax.swing.JOptionPane;18import javax.swing.JPanel;19import javax.swing.JTextField;20 21public 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