-
2017-06-17 15:02:35
最近写完了数据库的课程设计,想把整个源码的编辑过程发出来。程序很简单,需要有很多完善的地方,在这里,我想和大家分享写这个程序的心路历程。
首先,在开始写程序之前。我们需要先写一些工具类,来辅助完成整个程序的构建,在这里我把连接jdbc的代码放在了一个包下面。
如下图:
在这里我们先来写最基本的类,jdbcDrive,这是负责和数据库进行连接,并且执行语句的类
public class jdbcDrive { public static Connection connection; public static Statement statement; public static ResultSet resultset; public static void jdbcConnection(){
try { connection = DriverManager.getConnection(jdbc.dbURL, jdbc.userName,jdbc.userPwd); System.out.println("连接数据库成功!"); } catch (Exception e) { System.out.print("SQL Server连接失败!"); } } public static void jdbcConnectionClose(){ try { connection.close(); System.out.println("数据库连接成功关闭"); } catch (SQLException e) { System.out.println("数据库连接关闭失败"); } } public static void jdbcExecuteUpdate(String s) throws SQLException{ jdbcConnection(); statement=connection.createStatement(); statement.executeUpdate(s); } public static void jdbcExecuteQuery(String s) throws SQLException{ jdbcConnection(); statement=connection.createStatement(); resultset=statement.executeQuery(s); } public static void main(String [] args) { } }
在这里我选择的是SQL SERVER 2014,它的jdbc版本已经不需要加载数据库了,可以直接进行连接,在这里分为四个方法。其中两个是负责,数据库的连接和释放。jdbcExecuteUpdate负责传递SQL的增加,修改,删除,不需要有结果集的语句。jdbcExecuteQuery负责进行jdbc的查询,将查询的结果放在resultset里面。Connection类是负责进行数据库的连接,Statement 负责传递查询语句。resultset是结果集,负责保存储存的信息。
在进行数据的连接的时候,需要向数据库传递参数。我把参数放在了一个接口里面。
public interface jdbc { String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Dormitory"; String userName = "sa"; String userPwd = "123456"; }
写完基本的jdbc类之后,我们在进行整个系统的界面搭建。
设计主界面的时候,用到以下几个类,第一个是用于放置菜单选项的JMenuBar,它是放置JMenu的容器,而JMenu是房子JMenuItem的容器。具体的构建过程就是,在JFrame里添加JMenu,用来表示要放置的菜单选项,在JMenu里面放置JMeunItem用来表示菜单的子选项。其中,用了JLabel来存放图片。各个JMenuItem的监听事件放在了一个单独的包里面。具体的搭建界面如下:
public class Login extends JFrame { private JButton loginButton,exitButton; private JLabel userNameLabel,passwordLabel; private JTextField userNameText; private JPasswordField passwordText; private HandleAction handleAction; private static JPanel loginPanel; private ManagementUi MainUi; private Toolkit toolKit=null; private Dimension screenSize=null; public static personManage nowPeople; public Login(){ Init(); } public void Init(){ //获取当前窗口,并且获取屏幕的尺寸 toolKit=Toolkit.getDefaultToolkit(); screenSize=toolKit.getScreenSize(); //加载封装了图片的Panel子类,并添加到当前JFrame容器里面 loginPanel=new LoginPanel(); loginPanel.setLayout(null); add(loginPanel); //将整个图框居中 setBounds(screenSize.width/2-loginPanel.getWidth()/2 ,screenSize.height/2-loginPanel.getHeight()/2 ,loginPanel.getWidth(),loginPanel.getHeight()); handleAction=new HandleAction(); this.setIconImage(new ImageIcon("resource/picture.png").getImage()); //向loginPanel容器加入两个Jlabel,两个按钮,一个文本框,一个密码框 userNameLabel=new JLabel("用户名"); userNameLabel.setBounds(100, 120, 200, 18); loginPanel.add(userNameLabel); userNameText=new JTextField(); userNameText.setBounds(150, 120, 150, 18); loginPanel.add(userNameText); passwordLabel=new JLabel("密码"); passwordLabel.setBounds(100, 180, 200, 18); loginPanel.add(passwordLabel); passwordText=new JPasswordField(); passwordText.setBounds(150, 180, 150, 18); loginPanel.add(passwordText); loginButton=new JButton("登录"); loginButton.setBounds(150, 230, 60, 18); loginPanel.add(loginButton); exitButton=new JButton("退出"); exitButton.setBounds(230, 230, 60, 18); loginPanel.add(exitButton); exitButton.addActionListener(handleAction); loginButton.addActionListener(handleAction); setTitle("宁悦宿舍管理系统"); this.setResizable(false); setVisible(true); setDefaultCloseOperation(this.EXIT_ON_CLOSE); } private class HandleAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==loginButton){ String pass=new String(passwordText.getPassword()); if(jdbcLogin.Judge(userNameText.getText(),pass)){ nowPeople=new personManage(userNameText.getText(),null,null,pass); MainUi=new ManagementUi(); Login.this.setVisible(false); }else{ JOptionPane.showMessageDialog(Login.this,"不是系统的合法用户或密码错误" ); } }else if(e.getSource()==exitButton) { Login.this.dispose(); } } } public static void main(String [] args){ Login in=new Login(); } } class LoginPanel extends JPanel { protected ImageIcon icon = new ImageIcon("resource/login.jpg"); public int width = icon.getIconWidth(), height = icon.getIconHeight(); public LoginPanel() { super(); setSize(width, height); } protected void paintComponent(Graphics g) { super.paintComponent(g); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); } }
搭建完界面之后,我们按这个顺序来进行代码编码,首先,编写管理员的登录界面,然后写学生的管理界面,在写宿舍的管理界面,最后写调宿的管理界面。
下面先来看登录界面的的截图:
下面是整个登录界面的源代码:
public class Login extends JFrame { private JButton loginButton,exitButton; private JLabel userNameLabel,passwordLabel; private JTextField userNameText; private JPasswordField passwordText; private HandleAction handleAction; private static JPanel loginPanel; private ManagementUi MainUi; private Toolkit toolKit=null; private Dimension screenSize=null; public static personManage nowPeople; public Login(){ Init(); } public void Init(){ //获取当前窗口,并且获取屏幕的尺寸 toolKit=Toolkit.getDefaultToolkit(); screenSize=toolKit.getScreenSize(); //加载封装了图片的Panel子类,并添加到当前JFrame容器里面 loginPanel=new LoginPanel(); loginPanel.setLayout(null); add(loginPanel); //将整个图框居中 setBounds(screenSize.width/2-loginPanel.getWidth()/2 ,screenSize.height/2-loginPanel.getHeight()/2 ,loginPanel.getWidth(),loginPanel.getHeight()); handleAction=new HandleAction(); this.setIconImage(new ImageIcon("resource/picture.png").getImage()); //向loginPanel容器加入两个Jlabel,两个按钮,一个文本框,一个密码框 userNameLabel=new JLabel("用户名"); userNameLabel.setBounds(100, 120, 200, 18); loginPanel.add(userNameLabel); userNameText=new JTextField(); userNameText.setBounds(150, 120, 150, 18); loginPanel.add(userNameText); passwordLabel=new JLabel("密码"); passwordLabel.setBounds(100, 180, 200, 18); loginPanel.add(passwordLabel); passwordText=new JPasswordField(); passwordText.setBounds(150, 180, 150, 18); loginPanel.add(passwordText); loginButton=new JButton("登录"); loginButton.setBounds(150, 230, 60, 18); loginPanel.add(loginButton); exitButton=new JButton("退出"); exitButton.setBounds(230, 230, 60, 18); loginPanel.add(exitButton); exitButton.addActionListener(handleAction); loginButton.addActionListener(handleAction); setTitle("宁悦宿舍管理系统"); this.setResizable(false); setVisible(true); setDefaultCloseOperation(this.EXIT_ON_CLOSE); } private class HandleAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==loginButton){ String pass=new String(passwordText.getPassword()); if(jdbcLogin.Judge(userNameText.getText(),pass)){ nowPeople=new personManage(userNameText.getText(),null,null,pass); MainUi=new ManagementUi(); Login.this.setVisible(false); }else{ JOptionPane.showMessageDialog(Login.this,"不是系统的合法用户或密码错误" ); } }else if(e.getSource()==exitButton) { Login.this.dispose(); } } } public static void main(String [] args){ Login in=new Login(); } } class LoginPanel extends JPanel { protected ImageIcon icon = new ImageIcon("resource/login.jpg"); public int width = icon.getIconWidth(), height = icon.getIconHeight(); public LoginPanel() { super(); setSize(width, height); } protected void paintComponent(Graphics g) { super.paintComponent(g); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); } }
在的登录的时候,需要连接数据库,在登录模块,我专门为它建立了一个数据库的连接类,来进行数据库的建立。public class jdbcLogin { private static HashMap<String,String> people=new HashMap<String,String>(); public static boolean Judge(String user,String pass){ String SQL = "SELECT * FROM personManage"; boolean flag=false; try { jdbcDrive.jdbcConnection(); jdbcDrive.statement=jdbcDrive.connection.createStatement(); jdbcDrive.resultset=jdbcDrive.statement.executeQuery(SQL); while (jdbcDrive.resultset.next()) { people.put(jdbcDrive.resultset.getString(1).trim(),jdbcDrive.resultset.getString(4).trim()); } } catch (SQLException e) { e.printStackTrace(); }finally{ jdbcDrive.jdbcConnectionClose(); } if(people.containsKey(user)){ if(people.get(user).equals(pass)){ flag=true; } }else{ flag=false; } return flag; } }
如果数据库存在对应的账号,则返回true,让用户登录,否则返回false。数据库建立好了之后,需要进行管理人员的创立,修改,删除。
管理员的界面用表的形式,来进行相应的管理,管理的过程中,点击表中的数据,会相应的显示在下面的文本框里,在这里进行增删改查。每次完成曾删改查,都需要点击查询进行刷新,下面是整体的代码。
public class personManageUi { private JFrame mainJframe; private Container con; private JScrollPane JSpane; private MyJTable DataTable; private String [] names={"管理员账号","管理员姓名","管理员性别","管理人员密码"}; private JButton btn_Query,btn_Modify,btn_Add,btn_Delete; private JPanel jpn; private JPanel messageJpn; private JTextField nameText,passText,sexText,idText; private personManage personChange;//保存要修改的数据的信息 public personManageUi(){ mainJframe=new JFrame("管理员管理"); mainJframe.setSize(800, 600); mainJframe.setVisible(true); mainJframe.setResizable(false); mainJframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); mainJframe.setLocation(screenSize.width/2-400, screenSize.height/2-300); con=mainJframe.getContentPane(); con.setLayout(new GridLayout(3,1)); DataTable=new MyJTable(); DefaultTableModel df=new DefaultTableModel(names,0); df.setRowCount(20); DataTable.setModel(df); DataTable.addMouseListener(new table_selectActionListener()); JSpane=new JScrollPane(DataTable); con.add(JSpane); messageJpn=new JPanel(); messageJpn.setLayout(new GridBagLayout()); setComponent(new JLabel("管理人员账号:"),0,0,1,1,false); idText=new JTextField(); setComponent(idText,1,0,1,150,false); setComponent(new JLabel("管理人员姓名:"),2,0,1,1,false); nameText=new JTextField(); setComponent(nameText,3,0,1,150,true); setComponent(new JLabel("管理人员性别:"),0,1,1,1,false); sexText=new JTextField(); setComponent(sexText,1,1,1,150,false); setComponent(new JLabel("管理人员密码:"),2,1,1,1,false); passText=new JTextField(); setComponent(passText,3,1,1,150,true); con.add(messageJpn); jpn=new JPanel(); jpn.setLayout(new FlowLayout()); con.add(jpn); btn_Add=new JButton("添加"); btn_Add.addActionListener(new btn_AddActionListener()); jpn.add(btn_Add); jpn.add(new JLabel(" ")); btn_Query=new JButton("查询"); btn_Query.addActionListener(new btn_QueryActionListener()); jpn.add(btn_Query); jpn.add(new JLabel(" ")); btn_Modify=new JButton("修改"); btn_Modify.addActionListener(new btn_ModifyActionListener()); jpn.add(btn_Modify); jpn.add(new JLabel(" ")); btn_Delete=new JButton("删除"); btn_Delete.addActionListener(new btn_DeleteActionListener()); jpn.add(btn_Delete); } /* * 完成查询按钮的监听事件 */ private class btn_QueryActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jdbcPersonManage jp=new jdbcPersonManage(null); personManage people; try { jp.personQuery(); } catch (SQLException e1) { JOptionPane.showMessageDialog(mainJframe,"无法连接到数据库" ); }finally{ jdbcDrive.jdbcConnectionClose(); } ArrayList<personManage> personlist=jp.getPersonlist(); for(int i=0;i<personlist.size();i++){ people=personlist.get(i); String [] data={people.getPersonManageId(),people.getPersonManageName(), people.getPersonManageSex(),"**********"}; for(int j=0;j<4;j++){ DataTable.setValueAt(data[j], i, j); } } for(int i=0;i<4;i++){ DataTable.setValueAt("", personlist.size(), i); } } } /* * 完成对修改按钮的监听事件 */ private class btn_ModifyActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { jdbcPersonManage jpm=new jdbcPersonManage(null); try{ if(personChange.getPersonManageName()!=nameText.getText()){ jpm.personModify(personChange.getPersonManageId(), "personManageName",nameText.getText()); } if(personChange.getPersonManageSex()!=sexText.getText()){ jpm.personModify(personChange.getPersonManageId() , "personManageSex", sexText.getText()); } if(personChange.getPersonManagepassword()!=passText.getText()){ jpm.personModify(personChange.getPersonManagepassword() , "personManagepassword",passText.getText()); } JOptionPane.showMessageDialog(mainJframe,"修改成功" ); idText.setText(""); nameText.setText(""); sexText.setText(""); passText.setText(""); }catch(Exception e1){ System.out.println("修改失败"); JOptionPane.showMessageDialog(mainJframe,"修改失败" ); }finally{ jdbcDrive.jdbcConnectionClose(); } } } /* * 完成对表格的监听事件 */ private class table_selectActionListener extends MouseAdapter{ public void mouseClicked(MouseEvent event) { int row = DataTable.rowAtPoint(event.getPoint()); if(row!=-1){ personChange=new personManage.personManageBuild() .addManageId((String) DataTable.getValueAt(row, 0)) .addManageName((String) DataTable.getValueAt(row, 1)) .addManageSex((String) DataTable.getValueAt(row, 2)) .addManagePass((String) DataTable.getValueAt(row, 3)) .CreateManageBuild(); idText.setText(personChange.getPersonManageId()); nameText.setText(personChange.getPersonManageName()); sexText.setText(personChange.getPersonManageSex()); passText.setText(personChange.getPersonManagepassword()); } } } /* * 完成对增加按钮的监听 */ private class btn_AddActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { personManage p=new personManage .personManageBuild() .addManageId(idText.getText().trim()) .addManageName(nameText.getText().trim()) .addManageSex(sexText.getText().trim()) .addManagePass(passText.getText().trim()) .CreateManageBuild(); jdbcPersonManage jpm; try { jpm = new jdbcPersonManage(p); jpm.personAdd(); idText.setText(""); nameText.setText(""); passText.setText(""); sexText.setText(""); JOptionPane.showMessageDialog(mainJframe,"添加成功" ); } catch (Exception e1) { JOptionPane.showMessageDialog(mainJframe,"无法连接到数据库" ); }finally{ jdbcDrive.jdbcConnectionClose(); } } } /* * 完成对删除按钮的监听 */ private class btn_DeleteActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { personManage p=new personManage .personManageBuild() .addManageId(idText.getText().trim()) .CreateManageBuild(); jdbcPersonManage jpm= new jdbcPersonManage(p); try { jpm.personDelete(); idText.setText(""); nameText.setText(""); passText.setText(""); sexText.setText(""); JOptionPane.showMessageDialog(mainJframe, "删除成功"); } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(mainJframe, "删除失败"); } } } private void setComponent(JComponent component, int gridx, int gridy, int gridwidth, int ipadx, boolean fill) { final GridBagConstraints gridBagConstrains = new GridBagConstraints(); gridBagConstrains.gridx = gridx; gridBagConstrains.gridy = gridy; gridBagConstrains.insets = new Insets(10, 15, 3, 1); if (gridwidth > 1) gridBagConstrains.gridwidth = gridwidth; if (ipadx > 0) gridBagConstrains.ipadx = ipadx; if (fill) gridBagConstrains.fill = GridBagConstraints.HORIZONTAL; messageJpn.add(component, gridBagConstrains); } public static void main(String [] args){ new personManageUi(); } }
学生管理部分实现和这个差不多,需要说一下宿舍管理的部分,在宿舍管理的模块,借助树,来进行完整的修改。
具体的代码如下:
public class dormitoryUpdateUi extends JFrame{ private JScrollPane JSPane; private JTree Tree; private JPanel panel; private DefaultMutableTreeNode tmpNode,root; private DefaultTreeModel insert; private ArrayList<Dormitory> dormitory; private JTextField id; private JTextField sex; private JTextField ynumber; private JTextField snumber; private JTextField student; private JTextField money; private JTextField note; private JButton btn_query,btn_Modify,btn_Delete; private String attribute; private String changeAttribute; public dormitoryUpdateUi(){ this.setTitle("宿舍更新"); this.setVisible(true); this.setSize(800, 600); this.setResizable(false); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setLocationRelativeTo(null); this.setLayout(new BorderLayout()); root=new DefaultMutableTreeNode("文赢13号楼 "); insert=new DefaultTreeModel(root); Tree=new JTree(root); Tree.addTreeSelectionListener(new treeSelectActionListener()); JSPane=new JScrollPane(Tree); this.add(JSPane, BorderLayout.WEST); panel=new JPanel(); //panel.setPreferredSize(getPreferredSize()); this.add(panel, BorderLayout.CENTER); panel.setLayout(new GridBagLayout()); setComponent(new JLabel("宿舍号:"),0,0,1,1,false); id=new JTextField(); id.addActionListener(new jf_ActionListener()); setComponent(id,1,0,3,1,true); setComponent(new JLabel("住宿性别名:"),0,1,1,1,false); sex=new JTextField(); sex.addActionListener(new jf_ActionListener()); setComponent(sex,1,1,3,150,true); setComponent(new JLabel("应住人数:"),0,2,1,1,false); ynumber=new JTextField(); ynumber.addActionListener(new jf_ActionListener()); setComponent(ynumber,1,2,3,150,true); setComponent(new JLabel("实住人数:"),0,3,1,1,false); snumber=new JTextField(); snumber.addActionListener(new jf_ActionListener()); setComponent(snumber,1,3,3,150,true); setComponent(new JLabel("住宿费:"),0,4,1,1,false); money=new JTextField(); money.addActionListener(new jf_ActionListener()); setComponent(money,1,4,3,1,true); setComponent(new JLabel("舍长:"),0,5,1,1,false); student=new JTextField(); student.addActionListener(new jf_ActionListener()); setComponent(student,1,5,3,1,true); setComponent(new JLabel("备注"),0,6,1,1,false); note=new JTextField(); note.addActionListener(new jf_ActionListener()); setComponent(note,1,6,3,150,true); btn_query=new JButton("查询"); btn_query.addActionListener(new btn_queryActionListener()); setComponent(btn_query,0,7,1,1,false); btn_Modify=new JButton("修改"); btn_Modify.addActionListener(new btn_ModifyActionListener()); setComponent(btn_Modify,1,7,1,1,false); btn_Delete=new JButton("删除"); btn_Delete.addActionListener(new btn_DeleteActionListener()); setComponent(btn_Delete,2,7,1,1,false); } private class btn_queryActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { jdbcDormitory jd=new jdbcDormitory(); HashMap<Integer,ArrayList<Dormitory> > number=new HashMap<Integer,ArrayList<Dormitory>>(); ArrayList<Dormitory> floordormitory; int temp;//统计楼数 try { jd.dormitoryQuery(""); dormitory=jd.getDormitory(); for(Dormitory d:dormitory){ temp=Integer.parseInt(d.getDormitoryId().substring(2,3)); if(!number.containsKey(temp)){ floordormitory=new ArrayList<Dormitory>(); floordormitory.add(d); number.put(temp, floordormitory); }else{ number.get(temp).add(d); } } Object[] floors; floors=number.keySet().toArray(); for(int i=0;i<floors.length;i++) { floordormitory=number.get(floors[i]); tmpNode=new DefaultMutableTreeNode(floors[i]+"楼"); insert.insertNodeInto(tmpNode, root, 0); insert.reload(); for(int j=0;j<floordormitory.size();j++){ tmpNode.add(new DefaultMutableTreeNode(floordormitory.get(j).getDormitoryId())); } floordormitory=null; } } catch (SQLException e1) { e1.printStackTrace(); }finally{ jdbcDrive.jdbcConnectionClose(); } } } private class treeSelectActionListener implements TreeSelectionListener{ @Override public void valueChanged(TreeSelectionEvent e) { if(e.getPath().getLastPathComponent().toString().length()==5){ Dormitory d=null; String message=e.getPath().getLastPathComponent().toString(); for(Dormitory dor: dormitory){ if(dor.getDormitoryId().equals(message)){ d=dor; } } id.setText(d.getDormitoryId()); sex.setText(d.getDormitorySex()); ynumber.setText(d.getDormitoryPeople()); snumber.setText(d.getDormitoryPeopleNow()); student.setText(d.getStudentId()); money.setText(d.getMoney()); note.setText(d.getDormitoryNote()); } } } private class btn_ModifyActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { jdbcDormitory jd=new jdbcDormitory(); try{ jd.dormitoryModify(id.getText().trim() , attribute,changeAttribute); JOptionPane.showMessageDialog(dormitoryUpdateUi.this,"修改成功" ); id.setText(""); sex.setText(""); ynumber.setText(""); snumber.setText(""); student.setText(""); money.setText(""); note.setText(""); }catch(Exception e1){ e1.printStackTrace(); System.out.println("修改失败"); JOptionPane.showMessageDialog(dormitoryUpdateUi.this,"修改失败" ); }finally{ jdbcDrive.jdbcConnectionClose(); } } } private class jf_ActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { HashMap<JTextField,String> change=new HashMap<JTextField,String>(); change.put(id, "Dnumber"); change.put(sex, "Dsex"); change.put(ynumber, "Dynumber "); change.put(snumber, "Dsnumber "); change.put(student, "Dstudent "); change.put(money, "Dmoney "); change.put(note, "Dnote"); attribute=change.get((JTextField)e.getSource()); changeAttribute=((JTextField)e.getSource()).getText().trim(); } } private class btn_DeleteActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Dormitory d=new Dormitory .DormitoryBuilder() .addDormitoryId(id.getText().trim()) .CreateDormitory(); jdbcDormitory js=new jdbcDormitory(); try { js.dormitoryQuery("where Dnumber ="+"'"+""+d.getDormitoryId()+"'"); if(Integer.parseInt(js.getDormitory().get(0).getDormitoryPeopleNow())!=0){ JOptionPane.showMessageDialog(dormitoryUpdateUi.this, "宿舍有成员居住,无法删除"); }else{ js.dormitoryDelete(d); id.setText(""); sex.setText(""); ynumber.setText(""); snumber.setText(""); money.setText(""); note.setText(""); student.setText(""); JOptionPane.showMessageDialog(dormitoryUpdateUi.this, "删除成功"); } } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(dormitoryUpdateUi.this, "删除失败"); } } } private void setComponent(JComponent component, int gridx, int gridy, int gridwidth, int ipadx, boolean fill) { final GridBagConstraints gridBagConstrains = new GridBagConstraints(); gridBagConstrains.gridx = gridx; gridBagConstrains.gridy = gridy; gridBagConstrains.insets = new Insets(20, 20, 3, 1); if (gridwidth > 1) gridBagConstrains.gridwidth = gridwidth; if (ipadx > 0) gridBagConstrains.ipadx = ipadx; if (fill) gridBagConstrains.fill = GridBagConstraints.HORIZONTAL; panel.add(component, gridBagConstrains); } public static void main(String [] args){ dormitoryUpdateUi d=new dormitoryUpdateUi(); } }
下面是完整的源代码地址:
链接:https://pan.baidu.com/s/1zM-sDtoxR07bKydHBh996A
提取码:anwn
更多相关内容 -
Java+SQL server 学生宿舍管理系统 数据库课程设计 简单控制台输出功能 增删查改统计
2021-06-15 22:48:11Java+SQL server 学生宿舍管理系统 数据库课程设计 简单控制台输出功能 增删查改统计 -
SQl 学生宿舍管理系统数据库课程设计E-R+需求分析说明书
2021-04-02 09:00:20学生宿舍管理系统数据库的课程设计,包括需求分析说明书,E-R图,建库源码,总结等各种课程设计所需.... 学生宿舍管理系统数据库的课程设计,包括需求分析说明书,E-R图,建库源码,总结等各种课程设计所需.... -
数据库完整的课程设计——学生宿舍管理系统
2019-05-07 14:12:11自己做的数据库课程设计包括需求分析、逻辑结构设计、概念设计、物理结构设计、数据库实施和维护、sql语句增删查改、存储过程触发器都有、还有各种图也画了 -
学生宿舍管理系统数据库课程设计.pdf
2021-12-06 21:20:06学生宿舍管理系统数据库课程设计.pdf -
学生宿舍管理系统数据库课程设计汇本.doc
2021-10-11 08:32:03学生宿舍管理系统数据库课程设计汇本.doc -
Java+SQL server 2012学生宿舍管理系统 数据库课程设计 简单控制台输出功能 增删查改统计
2021-06-10 20:49:14此次课程设计的题目是学生宿舍管理系统 工具: 数据库用的是SQL server;IDE用的是eclipse 一、系统功能基本要求 为了便于对学生宿舍生活的管理,学生资料的管理,和快节奏、高效率的工作环境。我本次设计的课题是...题目:
此次课程设计的题目是学生宿舍管理系统
工具:
数据库用的是SQL server;IDE用的是eclipse
一、系统功能基本要求
为了便于对学生宿舍生活的管理,学生资料的管理,和快节奏、高效率的工作环境。我本次设计的课题是学生宿舍管理系统。
开发目的和意义:
A.管理学生宿舍信息达到安全、高效、方便效果
B.迅速查到所需学生、楼栋、宿舍、宿舍物品、宿舍维修等信息
C.学生宿舍管理系统便于管理人员办事效率越来越高
系统的作用:
A.要求用户必须输入正确的用户名和密码才可以进入系统
B.提供学生住宿情况、楼栋、宿舍、宿舍物品、宿舍维修的基本登记
C.可对上述的宿舍相关信息进行增删查改并统计
基本功能
A.宿舍信息维护:对宿舍信息进行添加、修改、删除,具体宿舍信息包括:宿舍编号、宿舍电话、应住人数、录入日期等信息;
B.宿舍信息查询:根据楼号、宿舍编号进行查询。具体包括:宿舍编号、应住人数、实住人数、空位数、宿舍电话、录入日期等信息;
C.宿舍信息统计:对楼号、房间数、应住人数、实住人数、空位数等进行统计并输出。二、功能模块设计
本宿舍管理系统通过管理员登录系统后,进行对学生信息、楼栋信息、宿舍信息、物品信息、维修信息,基本信息等进行管理(如图所示)
三、数据库概念结构设计
(分析系统中有哪些实体,实体之间存在怎样的联系,用文字描述,并绘制实体图和整体E-R图)
答:实体为楼栋、宿舍、学生、宿舍物品
楼栋实体图
(分析系统中有哪些实体,实体之间存在怎样的联系,用文字描述,并绘制实体图和整体E-R图)
答:实体为楼栋、宿舍、学生、宿舍物品
楼栋实体图
宿舍实体图
学生实体图
宿舍物品实体图
整体E-R图
四、数据库关系图
五、数据库及表结构的创建
dbo.LgTblcreate table LgTbl ( usrName char(10), usrPwd char(10) )
dbo.Build
create table Build ( Bno char(4) primary key not null, --楼号-学3 Bfloors_sum char(4) , --楼层数-6层 Broom_sum char(4) , --宿舍数-30间 Build_men int , --总人数-1066人 build_sex char(6) , --男/女宿舍-男生宿舍 inputtime char(11) --2021-02-01 )
dbo.Room
create table Room ( Bno char(4) not null, --楼号 -A Rno char(6) not null , --宿舍号 -606 Rymen int , --宿舍几人间 -6人间 Rphone char(11), --宿舍电话- 13672355529 inputtime char(11) , --2021-02-01 primary key(Rno,Bno), foreign key(Bno) references Build(Bno), )
dbo.Student
create table Student ( Sno char(12) primary key not null, --学号 -201955555500 Sname char(8) , --姓名-牛大春 Ssex char(2) , --性别 -男 Sdept char(10) , --专业 -自动化 Bno char(4) not null, --楼号 -学3 Rno char(6) not null , --宿舍号 -608 inputtime char(11) , --2021-02-01 foreign key(Bno) references Build(Bno), )
dbo.Goods
create table Goods ( Pno char(3) primary key, --物品号 Pname char(10) --物品名称 )
dbo.Repair
create table Repair ( Bno char(4) not null, Rno char(6) not null , Pno char(3) not null, Rsubmit char(10), --提交日期 Rsolove char(10), --解决日期 Rreason char(20), --维修原因 primary key(Bno,Rno,Pno), foreign key(Bno) references Build(Bno), foreign key(Pno) references Goods(Pno), )
六、系统主要功能界面
-
主要功能界面
-
管理员登录
-
查询所有学生的宿舍信息
-
查询所有楼栋信息
-
统计各楼栋宿舍的实住人数及应住人数
-
统计各楼栋的宿舍总数及实住宿舍及实住人数及应住人数
此处不再一一截出来了
七、系统部分代码
JDBCUnit.java
package room_system; import java.security.PublicKey; import java.sql.*; public class JDBCUnit { /* 驱动,定义连接数据库类型:SQL SERVER2012*/ private static String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";//驱动:com.microsoft.sqlserver.jdbc.SQLServerDriver public static String SerName; //服务器名字:127.0.0.1 public static String Dbname; //数据库名:room_system public static String userName; //用户名:sa public static String userPwd; //密码:123456 public static Connection getConnection(){ String dbURL="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=room_system"; Connection conn = null; try { //1.注册驱动 Class.forName(driverName); //2.建立连接 conn = DriverManager.getConnection(dbURL, "sa", "123456"); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 使用statement对象执行DML语句 */ public static void stmt_DML(String sql) { Connection conn = null; Statement stmt = null; try { conn = getConnection(); //1.创建Statement对象 stmt = conn.createStatement(); //2.执行sql语句 stmt.execute(sql); //3.关闭资源 stmt.close(); //关闭数据执行结果集合 conn.close(); //关闭数据库连接 } catch (Exception e) { e.printStackTrace(); } } /** * 使用PreparedStatement执行SQL语句 */ public static void ps_DML(String sql,ResultSet rs) { try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); //4.操作结果集 rs=ps.executeQuery(); //5.关闭资源 ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } /** * 判断登录用户是否存在 */ public static boolean login_flag(String usrName,String usrPwd) { String sql= "select * from LgTbl where usrName="+"'"+usrName+"'"+" and usrPwd= "+"'"+usrPwd+"'"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入学号Sno结果是否为空 */ public static boolean select_flag(String Sno) { String sql= "select Sno from Student where Sno=ltrim(rtrim("+"'"+Sno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入楼栋结果是否为空 */ public static boolean select_Bno(String Bno) { String sql= "select Bno from Room where Bno=ltrim(rtrim("+"'"+Bno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入宿舍结果是否为空 */ public static boolean select_Rno(String Rno) { String sql= "select Rno from Room where Rno=ltrim(rtrim("+"'"+Rno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入维修楼栋结果是否为空 */ public static boolean select_weixiuBno(String Bno) { String sql= "select Bno from Repair where Bno=ltrim(rtrim("+"'"+Bno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入维修宿舍结果是否为空 */ public static boolean select_weixiuRno(String Rno) { String sql= "select Rno from Repair where Rno=ltrim(rtrim("+"'"+Rno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 判断查询输入物品编号结果是否为空 */ public static boolean select_Pno(String Pno) { String sql= "select Pno from Goods where Pno=ltrim(rtrim("+"'"+Pno+"'))"; boolean flag=false; try { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()) { flag = true; } else { flag = false; } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return flag; } }
RoomDemo.java
package room_system; import static room_system.JDBCUnit.*; import java.sql.Connection; import java.util.Scanner; public class RoomDemo { public static void main(String[] args) { String s1; String[] s2; /* 用户登录系统 */ String usrName;//登录名 String usrPwd;//登录密码 System.out.println("请按登录名,登录密码的格式输入数据连接信息(用,分隔):"); Scanner loginUsr = new Scanner(System.in); s1 = loginUsr.next(); //输入的值赋给s1 s2= s1.split(","); //以’,'作为分隔符 usrName = s2[0]; usrPwd = s2[1]; if(login_flag(usrName,usrPwd)) //判断登录用户是否存在 { System.out.println(" "); System.out.println("*********************************"); System.out.println("* 用户登录成功! *"); System.out.println("* 欢迎使用学生信息管理系统! *"); System.out.println("*********************************"); System.out.println(" "); } else { System.out.println("********************************"); System.out.println("* 用户名或密码不正确! *"); System.out.println("********************************"); return ; } /* 主菜单 */ showMenu.show(); //调用showMenu的show方法,显示菜单 Scanner sc = new Scanner(System.in); while(true) { System.out.print("请输入您要执行操作的序号:"); int s ; while(true) { try { s = sc.nextInt(); //把输入的序号赋值给s break; } catch (Exception e) { System.out.println("输入格式错误,请重新输入!"); sc.nextLine(); } } switch (s) { case 1: Student_OP.select_allstudent(); //1.调用Student_OP所有学生信息的方法select_all() break; case 2: Student_OP.add_stu(); // //2.添加入住学生的宿舍信息的方法add_stu() break; case 3: Student_OP.alter_stu(); //3.更新入住学生的宿舍信息的方法alter_stu() break; case 4: Student_OP.delete_stu(); //4.删除学生信息的方法delete_stu() break; case 5: Student_OP.select_stu(); //5.查询指定学生的宿舍信息的方法select_stu() break; case 6: Build_OP.select_allbuild(); //6.查询所有楼栋的信息的方法select_allbuild() break; case 7: Build_OP.alter_build(); //7.更新指定楼栋的信息的方法alter_build() break; case 8: Build_OP.select_build(); //8.查询指定楼栋的信息的方法select_build() break; case 9: Room_OP.select_allroom(); //9.查询所有宿舍的信息的方法select_allroom() break; case 10: Room_OP.alter_room(); //10.更改指定楼栋宿舍的信息的方法alter_room() break; case 11: Room_OP.select_room() ; //11.查询指定楼栋宿舍的信息的方法select_room() break; case 12: Room_OP.add_room(); //12.添加指定的楼栋宿舍信息的方法add_room() break; case 13: Goods_OP.select_allgoods(); //13.查询所有的宿舍物品信息select_allgoods() break; case 14: Goods_OP.add_good(); //14.添加宿舍物品信息的方法add_good() break; case 15: Goods_OP.alter_good(); //15.更新指定的宿舍物品信息的方法alter_good() break; case 16: Repair_OP.select_allrepair(); //16.查询所有宿舍的维修信息的方法select_allrepair() break; case 17: Repair_OP.alter_repair(); //17.更新指定宿舍的维修信息的方法alter_repair() break; case 18: Repair_OP.add_repair(); //18.添加指定宿舍的维修信息的方法的add_repair() break; case 19: all_OP.select_all(); //19.统计各楼栋的实住人数及应住人数的方法select_all() break; case 20: all_OP.select_all1(); //20.统计各楼栋宿舍的实住人数以及应住人数select_all1() break; case 21: System.out.println("是否要退出系统(Y/N)?"); String string = sc.next(); if(string.equals("Y")||string.equals("y")) { System.out.println("已经成功退出系统!!!"); return; }else if (string.equals("N")||string.equals("n")) { System.out.println("已取消!"); break; }else { System.out.println("输入错误自动退回菜单!"); showMenu.show(); break; } case 22: showMenu.show(); break; default: System.out.println("输入编号错误!"); break; } } } }
Student_OP.java
package room_system; import static room_system.JDBCUnit.*; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner; public class Student_OP { //1.查询所有学生的宿舍信息的方法select_allstudent() public static void select_allstudent() { String sql = "select * from Student order by Sno"; //要执行的SQL语句 ResultSet rs; String Sno ; String Sname ; String Ssex ; String Sdept; String Bno; String Rno; String inputtime; try{ Connection conn = getConnection(); Statement stmt =conn.createStatement(); rs = stmt.executeQuery(sql); System.out.println("学号 "+","+"姓名 "+","+"性别"+","+"专业 "+","+"楼栋 "+","+"宿舍 "+","+"录入时间 "); System.out.println(); while(rs.next()) { Sno = rs.getString(1); Sname = rs.getString(2); Ssex = rs.getString(3); Sdept = rs.getString(4); Bno = rs.getString(5); Rno =rs.getString(6); inputtime =rs.getString(7); System.out.println(Sno+","+Sname+","+ Ssex+","+Sdept+","+Bno+","+Rno+","+inputtime); } stmt.close(); rs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } //2.添加入住学生的宿舍信息的方法add_stu() public static void add_stu() { String sql ; String s1; String[] s2; String Sno ; String Sname ; String Ssex ; String Sdept ; String Bno; String Rno ; String inputtime; System.out.println("请按照Sno,Sname,Ssex,Sdept,Bno,Rno,inputtng的格式录入学生信息:"); Scanner sc = new Scanner(System.in); s1 = sc.next(); s2= s1.split(","); try { Sno = s2[0]; Sname = s2[1]; Ssex = s2[2]; Sdept = s2[3]; Bno = s2[4]; Rno =s2[5]; inputtime =s2[6]; if(select_flag(Sno)==true) { //判断Sno是否存在,true System.out.println("录入失败:Sno已经存在!"); } else { String S_SQL = "insert into Student values("; sql = S_SQL + "'" + Sno + "'" + "," + "'" + Sname + "'" + "," + "'" + Ssex + "'" + "," + "'"+ Sdept + "'"+ "," + "'" + Bno + "'"+","+"'" + Rno + "'"+","+"'"+inputtime+"'"+ ")"; stmt_DML(sql); //执行SQL语句 System.out.println("成功录入Sno为 " + Sno + "的学生!"); System.out.println(); } } catch (Exception e) { System.out.println("输入格式错误请重新输入!"); } } //3.更新入住学生的宿舍信息的方法alter_stu() public static void alter_stu(){ String sql; System.out.println("请输入要更新信息的学生Sno"); Scanner sc = new Scanner(System.in); String Sno ; Sno=sc.next(); while(true) { //判断Sno是否存在 if(select_flag(Sno)==false) { System.out.println("您输入的Sno不存在,请重新输入"); while(true) { try { Sno=sc.next();//再输入 break; } catch (Exception e) { System.out.println("输入格式错误,请重新输入"); sc.nextLine(); } } }else { break; } } System.out.println("请输入要更改的信息格式为Sname,Rno,inputtime"); String s1 = sc.next(); //String s1;String []s2;s1=s1 = sc.next();s2= s1.split(","); String[] s2 = s1.split(","); String Sname = s2[0]; String Rno = s2[1]; String inputtime =s2[2]; sql = "update Student set Sname="+"'"+Sname+"'"+","+"Rno="+"'"+Rno+"'"+","+"inputtime="+"'"+inputtime+"'"+" where Sno="+"'"+Sno+"'"; stmt_DML(sql); System.out.println("成功更新Sno为 "+Sno+"的学生信息!"); System.out.println(); } //4.删除学生信息的方法delete_stu() public static void delete_stu() { String Sno; System.out.println("请输入要删除信息的学生Sno"); Scanner s1 = new Scanner(System.in); Sno = s1.next(); if (select_flag(Sno) == false) { System.out.println("您输入的Sno不存在!"); } else { String sql = "delete from Student where Sno =" + "'" + Sno + "'"; stmt_DML(sql); System.out.println("成功删除Sno为 " + Sno + "的学生"); System.out.println(); } } //5.查询指定学生的宿舍信息的方法select_stu() public static void select_stu() { System.out.println("请输入要查询信息的学生Sno"); Scanner sc = new Scanner(System.in); String Sno = sc.next(); if (select_flag(Sno) == false) { //false System.out.println("您输入的Sno不存在!"); } else { String sql = "select * from Student where Sno = " + "'" + Sno + "'"; ResultSet rs; try { Connection conn = getConnection(); Statement stmt =conn.createStatement(); rs = stmt.executeQuery(sql); System.out.println("学号 "+","+"姓名 "+","+"性别"+","+"专业 "+","+"楼栋 "+","+"宿舍 "+","+"录入时间 "); while (rs.next()) { Sno = rs.getString(1); String Sname = rs.getString(2); String Ssex = rs.getString(3); String Sdept = rs.getString(4); String Bno = rs.getString(5); String Rno = rs.getString(6); String inputtime = rs.getString(7); System.out.println(Sno+","+Sname+","+ Ssex+","+Sdept+","+Bno+","+Rno+","+inputtime); System.out.println(); } System.out.println(); rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
后面的代码都是大同小异了,也不一一贴出来了,需要的后续可以发出来,这也算是比较基础的代码了。做得不好请大神指点一下,球球了
资源在此
点击下载完
-
-
学生宿舍管理系统测试分析实施报告_学生宿舍管理系统数据库课程设计
2019-12-29 18:27:57教育资料 测试分析报告说明书 学生宿舍管理系统 目录 TOC \o "1-3" \h \z \u 一引言 4 1.1 测试目的 4 1.2项目背景 4 1.3定义 5 1.4术语定义 5 1.5参考资料 5 二任务概述 6 2.1目标 6 2.2运行环境 6 三计划 7 3.1... -
《数据库系统原理》课程设计报告(学生宿舍管理系统数据库设计)
2016-01-10 21:03:26纯文档的数据库宿舍管理系统课设,不含数据库代码,适合你们参考 -
数据库课程设计-学生宿舍管理信息系统
2019-04-30 15:24:49功能齐全,可以直接运行,实现学生离返校、住宿、报修等信息查询 -
数据库课程设计——学生宿舍信息管理系统
2018-09-17 23:33:00数据库课程设计——学生宿舍信息管理系统 目录 1.设计目的... 2 2、任务与要求... 2 3、学生宿舍管理系统课程设计... 2 3.1 引言... 2 3.2需求分析... 2 3.2.1....数据库课程设计——学生宿舍信息管理系统
目录
1.设计目的
《数据库系统原理》课程设计是软件工程和计算机科学与技术专业集中实践性环节之一,旨在让我们自身加深对数据库基础理论和基本知识的理解,掌握设计数据库管理系统的基本方法,锻炼运用知识解决实际问题的动手能力。
2、任务与要求
要求学生们从给定的设计题目中进行选择,进行需求分析,概念设计、逻辑设计,数据库的设计过程,表结构、表之间的关联,给出视图的定义、触发器的定义、索引,安全性的实现,用SQL语句等在SQL Server 2008系统中实现数据库的数据输入,查询,更新和输出;给出实现效果截图及部分测试结果。
3、学生宿舍管理系统课程设计
3.1 引言
随着社会的发展以及教育水平的提高,当今社会在校生的数量越来越庞大。与此同时,使用曾经的手工的方式对学生的信息进行管理效率非常低下。在互联网技术高度发达的今天 ,使用数据库技术队对学生的住信息进行管理能够使学校对学生信息的管理更加的高效,检索迅速,查找方便,可靠性高存储量大。使用数据库技术的这些优点可以使得学生信息出错的发生。同时使用数据库技术可以使学生住宿信息长时间稳定地保存,也不容易丢失。开发出这样的一个数据库迫在眉睫。
3.2需求分析
系统需求调查的方法为访谈法,通过对多个学校的宿舍管理人员进行交谈,从而得出系统的主要任务和特定的要求。系统的主要任务是能够对宿舍信息,学生信息,管理员信息,住宿信息进行登记,调整,并能进行各种查询以及信息的备份。
完整性要求:防止不符合语义的数据进入数据库。
安全性要求:需要防止客户对数据进行未经授权的访问。
性能要求:最好能够实现并发访问,允许多个用户同时对数据库中的数据进行访问。
一致性要求:防止数据库进入不一致状态。
数据库要求:各种各样的故障都可能发生,出现意外时,,尽可能的确保任何数据在任何情况下都不会丢失。
3.2.2
系统的业务流程:
学生入住和退宿时通过管理员进行登记;
住宿产生的各种费用以及使用的各项物品由管理员进行登记;
管理员将登记的各项信息上报给教务处;
教务处将各项住宿信息进行统一管理;
储存的所有数据供不同权限的客户进行访问;
数据字典:
学生基本信息
编号
属性名
类型
解释
备注
0001
学号
Varchar(15)
无
无
0002
姓名
Varchar(10)
无
无
0003
性别
Varchar(2)
无
男、女
0004
年龄
Int
无
0……100之间
0005
手机号
Varchar(15)
手机号码
无
0006
专业
Varchar(20)
无
无
住宿费用信息:
编号
属性名
类型
解释
备注
0008
表单编号
Varchar(15)
无
无
0009
学号
Varchar(15)
无
无
0010
宿舍号
Varchar(6)
不是门牌号
无
0011
水费
Double(6)
无
大于0
0012
电费
Double(6)
无
大于0
0013
维修费
Double(6)
无
大于0
0014
住宿费
Double(6)
无
大于0
0015
日期
Date(8)
无
无
0016
合计
Double(6)
无
大于0
物品管理信息:
编号
属性名
类型
解释
备注
0017
员工号
Varchar(15)
无
无
0018
宿舍号
Varchar(15)
无
无
0019
桌子
Int
无
大于0
0020
椅子
Int
无
大于0
0021
床
Int
无
大于0
0022
电扇
Int
无
大于0
0023
灯
Int
无
大于0
0024
窗户
Int
无
大于0
宿舍信息
编号
属性名
类型
解释
备注
0025
宿舍编号
Varchar(15)
无
无
0026
楼号
Varchar(15)
无
无
0027
区域
Varchar(15)
校园内
ABCDEFG
0028
人数
Int
无
0……8
0029
房间类型
Varchar(15)
按人数分
1(四人)2(六人)3(八人)
管理员信息
编号
属性名
类型
解释
备注
0030
员工号
Varchar(15)
无
无
0031
姓名
Varchar(10)
无
无
0032
性别
Varchar(2)
无
男,女
0033
年龄
Int
无
0……100
0034
手机号
Varchar(15)
无
11位
0035
楼号
int
无
无
0036
区域
int
无
ABCDEFG
0037
职位
Varchar(2)
无
1(高级员工)2(普通员工)
3.2.2 系统功能描述:
对学生的信息进行管理;
对宿舍信息进行管理;
对管理员信息进行管理;
对宿舍物品进行登记和管理;
对住宿产生的各项费用进行登记和管理;
对已经更改的学生和管理员信息进行保存
在这幅图中,其中各项从左往右前5部分功能都包括各自信息的增删改查,第六项功能为学生和教师信息的备份,也就是已修改信息储存。
3.3概念设计
(说明使用数据库概念设计的基本思想和原理方法,设计出系统E-R图)
基本思想:将需求分析得到的用户需求抽象为信息结构,分析数据字典中数据字典间内在语义关联,并将其抽象表示为数据的概念模式,从而能真实,充分地反应真实世界,包括事物和事物之间的联系,能满足用户对数据的处理需求,是现实世界的一个真实模型,易于理解,从而可以用它和不熟悉计算机的人交换意见,且易于更改。方法:首先分析整个系统中涉及到的实体,得到局部的ER图。然后分析这些实体之间的关系,进行连接从而得到
3.4逻辑设计
基本思想:首先整个系统一共可以划分出三个实体,分别是学生,管理员和宿舍,三者之间构成一个三角关系。同时,学生和宿舍之间的住宿关系衍生出一系列的住宿产生的费用,管理员和宿舍的管理关系衍生出一系列需要管理的物品,因此五张表相互关联生成完整的数据库系统。
数据库关系图:
学生的个人信息:学号,姓名,性别,年龄,手机号码,专业,管理员号
student(stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe,manager_num)
宿舍费用信息:表单编号,水费,电费,维修费,住宿费,总费用,日期
live(list_num,stu_num,dor_num,water,electric,service,lodge,total,date)
宿舍物品信息:桌子,椅子,床,灯,
tool(mana_num,dor_num,table,chair,bed,light)
宿舍信息:宿舍编号,人数,房间类型,楼号,区域
dormitory(dor_num ,prople_total,size, build_num,zone)
宿舍管理人员信息:员工号,姓名,性别,年龄,手机号
manager(mana_num,mana_name,mana_gender,mana_age,mana_tele)
3.5物理结构设计
物理设计的基本思想:根据逻辑设计出的逻辑模式,DBMS及计算机系统所提供的手段和施加的限制,设计数据库的内模式,即文件结构,各种路径,控件分配,记录的存取方式等,为逻辑数据结构选取一个最合适的应用环境的物理结构。
学生基本信息表:
属性名
类型
长度
备注
Stu_num
varchar
15
无
Stu_name
varchar
10
无
Stu_gender
varchar
2
男、女
Stu_age
int
4
0……100之间
Stu_tele
varchar
15
无
Stu_spe
varchar
20
无
住宿费用信息表:
属性名
类型
长度
备注
List_num
Varchar
15
无
Stu_num
Varchar
15
无
Dor_num
Varchar
15
无
water
double
6
大于0
Elect
double
6
大于0
Repaire
double
6
大于0
live
double
6
大于0
date
date
8
指的是具体一年
物品管理信息表:
属性名
类型
长度
备注
Mana_num
Varchar
15
无
Dor_num
Varchar
15
无
Desk
Int
2
大于0
Chair
Int
2
大于0
Bed
Int
2
大于0
fan
Int
2
大于0
lighr
Int
2
大于0
window
Int
2
大于0
宿舍信息表:
属性名
类型
长度
备注
Dor_num
Varchar
15
无
Build_num
Varchar
2
无
Zone
Varchar
2
ABCDEFG
People_total
Int
2
0……8
size
varchar
2
1(四人)2(六人)3(八人)
管理员信息表:
属性名
类型
长度
备注
Mana_num
Varchar
15
无
Mana_name
Varchar
10
无
Mana_gender
Varchar
2
男,女
Mana_age
Int
4
0……100
Mana_tele
varchar
15
11位
Build_num
int
2
无
zone
varchar
2
ABCDEFG
3.6数据库实施
数据库的实施:数据库设计完成后,设计人员要用DBMS提供的数据定义语言和其他的使用程序将数据库逻辑结构设计和物理结构设计的结构用DDL严格描绘出来,成为DBMS可以接受的源代码,再经过调试产生目标模式。最后将数据装入数据库。
3.6.1数据库表的定义
创建学生信息表:
Create table student
(stu_num varchar(15),
Stu_name varchar(10),
Stu_gender varchar(2) check(stu_gender=’男’ or stu_gender=’女’),
Stu_age int check(stu_age>0 and stu_age<100),
Stu_tele varchar(15),
Stu_spe varchar(20),
Primary key (stu_num),
);
创建费用信息表:
Create table live
( list_num varchar(15),
Stu_num varchar(15),
Dor_num varchar(15),
Water float check(water>=0),
Elect float check(elect>=0),
Repair float check(repair>=0),
Living float check(living>=0),
statu int default(1),
Date date,
Primary key(list_num),
Foreign key (stu_num ) references student(stu_num)
on update cascade,
Foreign key (dor_num ) references dormitory(dor_num)
on update cascade
);
创建物品信息管理表:
Create table tool
( mana_num varchar(15),
Dor_num varchar(15),
desk int check(desk>=0),
Chair int check(chair>=0),
Bed int check(bed>=0),
Light int check(light>=0),
Primary key (dor_num),
Foreign key (mana_num ) references manager(mana_num)
on update cascade on delete set null
);
创建宿舍信息管理表:
Create table dormitory
(dor_num varchar(15),
People_total int check(people_total>=0 and people_total<=8),
Size int check(size=1 or size=2 or size=3)
);
创建管理员信息表:
Create table manager
(mana_num varchar(15),
mana_name varchar(10),
mana_gender varchar(2) check(stu_gender='男' or stu_gender='女'),
mana_age int check(stu_age>0 and stu_age<100),
mana_tele varchar(15),
Primary key (mana_num)
);
3.6.2视图的定义:
所有的信息汇总在一起:
Create view allmass
(stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe,stu_statu,list_num,dor_num,water,elect,repair,living,live_status,Date,people_total,size,dor_status,mana_num,desk,chair,bed,light,tool_statu,mana_name,mana_gender,mana_age,mana_tele,mana_statu)
as select student.stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe,stu_statu,list_num,dormitory.dor_num,water,elect,repair,living,live_statu,Date,people_total,size,dor_statu,manager.mana_num,desk,chair,bed,light,tool_statu,mana_name,mana_gender,mana_age,mana_tele,mana_statu
from student,lives,dormitory,tool,manager
where student.stu_num=lives.stu_num
and lives.dor_num=dormitory.dor_num
and dormitory.dor_num=tool.dor_num
and tool.mana_num= manager.mana_num ;
学生信息视图:
Select stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe,mana_name
from allmass
where stu_statu=1;
管理员信息:
create view manager_view
as
select manager.mana_num,mana_name,mana_age,mana_gender,mana_tele
from manager
where mana_statu=1;
宿舍信息:
create view dormitory_view
as
select tool.dor_num,build_num,zone,people_total,size
from tool,dormitory
where tool.dor_num=dormitory.dor_num and dor_statu=1;
物品信息:
create view tool_view
as
select dor_num,mana_num, desk,chair,bed,light
from tool
where tool_statu=1;
账单信息:
create view lives_view
as
select list_num,stu_name,dor_num,water,elect,date,repair,living
from lives,student
where live_statu=1 and lives.stu_num=student.stu_num;
3.6.3索引:
每一张表通过主键的列产生索引,从而加快查询时的进度。
拿学生信息表进行举例:
Create index stu_index on student(stu_num);
当然可以通过数据库自动生成。
3.6.4触发器的定义:
在学生表上建立触发器,记录被修改的信息。在原表中通过一个状态属性标示是否被删除,因此数据并不会真正被删除,只需要记录被修改的信息。
create trigger on_pre_stu
on student
for update
as
begin
declare @stu_num varchar(15)
declare @pre_stu_name varchar(10)
declare @pre_stu_gender varchar(2)
declare @pre_stu_age int
declare @pre_stu_tele varchar(15)
declare @pre_stu_spe varchar(20)
select @stu_num = stu_num from deleted
select @pre_stu_name =stu_name from deleted
select @pre_stu_gender =stu_gender from deleted
select @pre_stu_age = stu_age from deleted
select @pre_stu_tele =stu_tele from deleted
select @pre_stu_spe = stu_spe from deleted
insert into pre_stu(stu_num,pre_stu_name,pre_stu_gender,pre_stu_age,pre_stu_tele,pre_stu_spe )
values(@stu_num,@pre_stu_name,@pre_stu_gender,@pre_stu_age,@pre_stu_tele,@pre_stu_spe)
end
在管理员上建立触发器,记录被修改的信息。在原表中通过一个状态属性标示是否被删除,因此数据并不会真正被删除,只需要记录被修改的信息。
create trigger on_pre_mana
on manager
for update
as
begin
declare @mana_num varchar(15)
declare @pre_mana_name varchar(10)
declare @pre_mana_gender varchar(2)
declare @pre_mana_age int
declare @pre_mana_tele varchar(15)
select @mana_num = mana_num from deleted
select @pre_mana_name =mana_name from deleted
select @pre_mana_gender =mana_gender from deleted
select @pre_mana_age = mana_age from deleted
select @pre_mana_tele =mana_tele from deleted
insert
into pre_mana(mana_num,pre_mana_name,pre_mana_gender,pre_mana_age,pre_mana_tele)values(@mana_num,@pre_mana_name,@pre_mana_gender,@pre_mana_age,@pre_mana_tele)
end
3.6.5用户的定义:
create user dba for login dba with default_schema=dbo
exec sp_addrolemember 'db_owner' ,'dba'
3.6.6 对数据的管理:
对数据的管理主要是由增删改查组成,以学生信息的管理为例,
增加:
insert into
student(stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe,stu_statu)
values('201677H0555','刘飞达','男',19,14646646465,'软工',1);
删除:值得注意的是我删除信息用的是更新信息语句,只需要更改状态值即可标示数据是否被删除,数据不会真的被删除,做好了别分工作。
update student set stu_status=0 where stu_num=’201677H0522’;
修改:
update student set stu_name='刘豪' where stu_num='201677H0522';
查询:值得注意的是查询的条件是数据行的状态值是1,也就是被标示未被删除。
select stu_num,stu_name,stu_gender,stu_age,stu_tele,stu_spe from student where stu_statu=1;
分别查询每一个宿舍的总费用,并且按照宿舍号进行排序(使用的是分组求和的思想):
select dor_num , sum(w ater+elect + repair +living) from lives group by dor_num order by dor_num ;
在sql代码执行的过程中,会自动生成存储过程,将有价值的存储过程进行储存。
3.7系统调试和测试
在对数据库的备份功能进行测试的过程中,我在原表中对数据进行修改,从而触动触发器将被删除的信息储存在备份表中。执行语句update student set stu_name='刘豪' where stu_num='201677H0522'; 然后查看备份表中的信息,验证之后正确。
把数据库总所有的信息联合起来,形成一张非常大的表,生成一个视图,测试之后,可以成功生成,满足要求。
在安全性方面,我创建了用户并且进行了授权:
create login dba with password='123456', default_database=stu_dor_manage;
create user dba for login dba with default_schema=dbo
exec sp_addrolemember 'db_owner' ,'dba'
执行以后,成功生成了一个用户:测试成功!
4.系统评价
4.1我的系统特色:
A、数据结构化 ,数据之间具有联系,面向整个系统。
B、数据的共享性高,冗余度低,易扩充 。
C、数据独立性高 。
D、数据由DBMS统一管理和控制。4.2 系统不足及改进
在对数据库进行设计的过程中,结构比较简单,不能够应对是否能复杂的情况,只能对学生住宿的简单信息进行操作。另外,在安全性方面做得也不够完善,主要原因在于设计的重点是功能的正常执行,而不是在每一个细节做到完美。另外,执行虚度方面没有做出专门的优化。因此,这个数据库系统需要我在以后相信的去完成每一个细节。
5.设计心得
在设计数据库的过程中我遇到过非常多的问题:
首先,在设计阶段有非常多的数据项,当时觉得不好分类和处理,而且有很多的数据项和许多实体都有关系。最后通过查看课本例题,问同学等方式将各个数据项进行归类,对于和多个实体之间都有关系的数据项可以建立一个关系表,从而完成归类。
接着,在添加数据的过程中,我忽略掉了数据的参照完整性,导致许多数据不能够正常加入。后来经过同学的提示,我将数据进行了统一分析,保持所有的数据一致,最后数据可以正常输入。
最后,每个表中的数据更改完成之后,更改后的数据会丢失找不到了。对于这个问题就解决办法为加入触发器,记录表中信息的修改前的值,成功解决问题。
收获:对于一个系统,数据库的设计是非常重要的,数据库设计决定了以后数据好不好维护。后期需求好不好展。同时也决定了系统的性能。一个坏的数据库设计一个功能点的改动可能会设计多张表的改动。一不小心可能就会引起数据的不一致。为了解决这些问题。在数据库设计之初就要考虑这些问题。减少后期系统维护量。
-
学生宿舍管理系统(完整的数据库课程设计)
2010-06-03 10:32:21主要内容: (1)了解目前宿舍管理的现状以及SQL Server 2000的功能和特点。 (2)通过实地调查和问答-记录的方式了解宿舍管理的工作业务流程,并记录和处理相关的数据。 -
JAVA综合课程设计 学生宿舍管理系统
2020-12-28 11:37:40学生宿舍管理系统的开发主要包括前台用户界面的开发和后台数据库的开发,对于后台数据库的建立和维护要求建立起数据一致性和完整性强、数据安全性好的数据库。而对于前端应用程序的开发则要求应用程序能提供强大的... -
数据库系统原理课程设计报告范例学生宿舍管理系统数据库设计.doc
2021-10-06 23:39:59数据库系统原理课程设计报告范例学生宿舍管理系统数据库设计.doc -
Java基于sql数据库的宿舍管理系统
2015-12-27 15:40:19java基于sql数据库的宿舍管理系统源码以及文档 -
《数据库课程设计》学生宿舍管理系统.doc
2022-01-01 10:02:151. 系统需求分析阶段 1 1.1 引言 1 1.2 目标与任务 1 1.2.1 需求分析阶段的目标 1 1.2.2 需求分析阶段的任务 1 1.2.3 需求分析阶段成果 2 2. 概念设计阶段 11 2.1 引言 11 2.2 概念模型设计 12 2.3 新系统流程 13 3... -
数据库课程设计学生宿舍管理系统
2011-06-27 11:40:39数据库课程设计 学生宿舍管理系统 包括前后台源程序 代码和一份完整文档 -
基于J2EE的 学生宿舍管理系统(内含数据库代码、WEB网页代码)
2019-03-18 15:23:41这是一个比较完善的毕业设计管理信息系统,采用J2EE语言和MYSQL数据库编写,里面包括源代码、数据库、等所需材料 -
基于ssm的学生宿舍管理系统
2020-01-02 09:51:16ssm学生宿舍管理系统,maven多模块搭建,实现用户分角色登录+分页等技术 项目描述 maven分模块项目+SSM宿舍管理系统+spring mvc+jquery+bootstrap+多模块+svn+分角色登录+分页+拦截器+收邮件。发邮件等。。。。。。 ... -
学生宿舍管理系统--数据库课程设计.doc
2021-10-03 15:59:10学生宿舍管理系统--数据库课程设计.doc -
Java+SSM基于java Web的大学生宿舍管理系统(毕业设计、课程设计使用) .zip
2021-08-31 11:38:04可完全做为毕业设计、课程设计使用,界面美观、功能齐全。 -
javaweb宿舍管理系统的设计与实现.doc(含毕业论文)
2021-04-22 22:19:083.2.3 宿舍管理 6 3.2.4 管理员模块 7 第4章 系统设计 8 4.1 总体设计 8 4.2 详细设计 8 4.2.1 各模块设计 8 4.2.2 数据库逻辑结构设计 9 第5章 系统实现与测试 12 5.1 系统实现 12 5.1.1 用户登录模块 12 5.1.2 ... -
宿舍信息管理系统数据库课程设计分析x_学生宿舍信息管理系统报告
2020-02-26 09:58:40课 程 设 计 题 班 目 级 宿舍信息管理系统 09 级计科 3 班 指导教师 李必云 2012 年 10 月 吉首大学信息科学与工程学院 项目分工 摘要 宿舍系统对于一个学校来说是必不可少的组成部分目前好多学校还停留在宿舍管理 ... -
宿舍信息管理系统课程设计
2019-01-24 08:28:01本课题要实现的是高校学生宿舍管理系统,在设计该系统时,应尽可能的贴近学生,便于用户操作。系统在实现上应该具有如下功能: 1.系统要求用户必须输入正确的用户名和密码才能进入系统。 2.系统应该提供学生住宿情况... -
《数据库课程设计》学生宿舍管理系统.zip
2022-03-07 10:39:12《数据库课程设计》学生宿舍管理系统.zip -
学生宿舍管理系统.zip
2021-01-20 15:21:42该系统基于软工概论的课程大作业,只是一个原型的制作