【记录贴】数据库课程设计——学生信息管理系统
前言
記錄下學(xué)習(xí)的點(diǎn)點(diǎn)滴滴,留下屬于我的足跡。
以此篇記錄我的第一次課程設(shè)計(jì)。
課設(shè)實(shí)現(xiàn)
一、課程設(shè)計(jì)題目
題目一 學(xué)生信息管理系統(tǒng)二、總體設(shè)計(jì)
原理及工具
JAVA的前端搭建:JAVA GUI MySQL的數(shù)據(jù)庫(kù)后端搭建:DDL,DQL,DML,DCL。 數(shù)據(jù)庫(kù)與前端的連接:mysql-connector-java等模塊介紹
該學(xué)生信息管理系統(tǒng)主要分為6個(gè)模塊:①身份驗(yàn)證模塊②新生信息輸入模塊③教務(wù)信息輸入之學(xué)籍變更模塊④教務(wù)信息輸入之獎(jiǎng)學(xué)金評(píng)定模塊⑤教務(wù)信息輸入之處罰記錄模塊⑥個(gè)人信息查詢修改模塊設(shè)計(jì)步驟
①構(gòu)建身份驗(yàn)證登錄窗口; ②設(shè)計(jì)登陸界面與信息變更查詢的選擇框界面的跳轉(zhuǎn); ③設(shè)計(jì)選擇框與模塊2、3、4、5、6的跳轉(zhuǎn); ④完善各個(gè)界面的功能設(shè)計(jì); ⑤美化界面。詳細(xì)設(shè)計(jì)
需求分析:
1.系統(tǒng)需求分析
學(xué)校每年都有新生入學(xué)、老生畢業(yè),還有其他各種人事變動(dòng)。如何有效地管理這些學(xué)生 的信息,幫助學(xué)校和老師掌握學(xué)生的情況,這就是學(xué)生信息管理系統(tǒng)需要完成的功能。
2.數(shù)據(jù)庫(kù)需求分析
可以列出以下記錄學(xué)生信息所需的數(shù)據(jù)項(xiàng)和數(shù)據(jù)結(jié)構(gòu):學(xué)生:學(xué)號(hào)、姓名、性別、生日、籍貫、所在院系、所在班級(jí)。處罰記錄:記錄號(hào)、級(jí)別、處罰對(duì)象、記錄時(shí)間、詳細(xì)描述、是否生效。 獎(jiǎng)勵(lì)記錄:記錄號(hào)、級(jí)別、獎(jiǎng)勵(lì)對(duì)象、記錄時(shí)間、詳細(xì)描述。學(xué)籍變更記錄:記錄號(hào)、變更情況、記錄對(duì)象、記錄時(shí)間、詳細(xì)描述。 所需的外部數(shù)據(jù)支持:班級(jí):班級(jí)編號(hào)、班級(jí)名稱、所屬院系、班長(zhǎng)。院系:代碼、名稱。功能分析
本系統(tǒng)主要的功能是收集學(xué)生的個(gè)人信息,以便向教師提供每個(gè)學(xué)生在校的情況。系統(tǒng) 的主要功能有:
①學(xué)生個(gè)人信息輸入,包括:姓名、性別、院系、生日、籍貫、生源所在地等。
②學(xué)生流動(dòng)情況的輸入,包括:轉(zhuǎn)系、休學(xué)、復(fù)學(xué)、退學(xué)、畢業(yè)。
③獎(jiǎng)懲情況的輸入。
④學(xué)生個(gè)人情況查詢和修改,包括流動(dòng)情況和獎(jiǎng)罰情況。
概念模型(E-R模型)
邏輯設(shè)計(jì)
物理設(shè)計(jì)(MySQL后端開發(fā))
部分代碼(其他類似)
構(gòu)建student表,設(shè)置外鍵,建立級(jí)聯(lián):
create table student( studentid char(15) not null primary key, name char(10) not null, sex char(2) not null, class char(4) not null, department char(2) not null, birthday date null, native_place char(10) null, constraint fk_class foreign key (class) references class(id) on update cascade on delete cascade, constraint fk_department foreign key (department) references department(id) on update cascade on delete cascade);前端開發(fā)(Java):
關(guān)鍵代碼:
定性查詢、將數(shù)據(jù)存入JTable表:
憨憨如我,一開始沒(méi)想這么多,建立了一個(gè)超大的表
//定義Vector title, title1, title2, title3, title4 = null;JTable table = null;JScrollPane scrollpane = null; // 建表title = new Vector();title1 = new Vector();title2 = new Vector();title3 = new Vector();title4 = new Vector();title1.add("學(xué)號(hào)");title1.add("姓名");title1.add("性別");title1.add("籍貫");title1.add("學(xué)籍變更");title1.add("記錄時(shí)間");title1.add("描述");title1.add("獎(jiǎng)勵(lì)");title1.add("記錄時(shí)間");title1.add("描述");title1.add("處罰");title1.add("記錄時(shí)間");title1.add("描述");title1.add("是否生效");table = new JTable(title, title1);table.setPreferredScrollableViewportSize(new Dimension(450, 160));scrollpane = new JScrollPane(table);scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); public void queryProcess(String sQueryField) {try {// 建立查詢條件String sql1 = "select student.studentid,student.name,student.sex,student.class,student.department,student.birthday,student.native_place,\r\n"+ " change_code.description4,change_al.rec_time1,change_al.description1,\r\n"+ " reward_levels.description5,reward.rec_time2,reward.description2,\r\n"+ " punish_levels.description6,punishment.rec_time3,punishment.description3,punishment.enable\r\n"+ "from student,change_al,reward,punishment,change_code,reward_levels,punish_levels\r\n"+ "where student.studentid=reward.studentid and student.studentid=change_al.studentid and student.studentid=punishment.studentid \r\n"+ " and change_al.change_al=change_code.code and reward.levels=reward_levels.code and punishment.levels=punish_levels.code \r\n"+ " and ";String queryFieldStr = jCBSelectQueryFieldTransfer(box_choose);sql1 = sql1 + queryFieldStr + "='" + sQueryField + "';";System.out.println("queryProcess(). sql = " + sql1);db.connect();ResultSet rs1 = db.executeQuery(sql1);// 將查詢獲得的記錄數(shù)據(jù),轉(zhuǎn)換成適合生成JTable的數(shù)據(jù)形式title.clear();while (rs1.next()) {Vector v = new Vector();v.add(rs1.getString("studentid"));v.add(rs1.getString("name"));v.add(rs1.getString("sex"));v.add(rs1.getString("birthday"));v.add(rs1.getString("native_place"));v.add(rs1.getString("description4"));v.add(rs1.getString("rec_time1"));v.add(rs1.getString("description1"));v.add(rs1.getString("description5"));v.add(rs1.getString("rec_time2"));v.add(rs1.getString("description2"));v.add(rs1.getString("description6"));v.add(rs1.getString("rec_time3"));v.add(rs1.getString("description3"));v.add(rs1.getString("enable"));title.add(v);}table.updateUI();db.disconnect();} catch (SQLException sqle) {System.out.println("sqle = " + sqle);JOptionPane.showMessageDialog(null, "數(shù)據(jù)操作錯(cuò)誤", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);} catch (Exception e) {System.out.println("e = " + e);JOptionPane.showMessageDialog(null, "數(shù)據(jù)操作錯(cuò)誤", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);}}簡(jiǎn)易登錄
public class login {public login() {//設(shè)置窗口JFrame jf = new JFrame();// jf.setResizable(false);jf.setSize(580, 350);jf.setLocation(20, 20);jf.setLayout(new BorderLayout());//定義組件JLabel label1 = new JLabel("賬戶 :");//設(shè)置賬戶label1.setFont(new Font("Dialog", 1, 15));label1.setForeground(Color.BLACK);JLabel label2 = new JLabel("密碼 :");//設(shè)置密碼label2.setFont(new Font("Dialog", 1, 15));label2.setForeground(Color.BLACK);JTextField text = new JTextField(13);//設(shè)置賬戶文本框text.setBorder(BorderFactory.createLineBorder(Color.darkGray));JPasswordField password = new JPasswordField(13);//設(shè)置密碼文本框password.setBorder(BorderFactory.createLineBorder(Color.darkGray));JButton button = new JButton("登錄");//設(shè)置登錄按鈕button.setBorderPainted(false);button.setForeground(Color.GRAY);button.setBackground(Color.ORANGE);// 設(shè)置背景面板JPanel panel1 = new JPanel() {public void paintComponent(Graphics g) {super.paintComponent(g);ImageIcon image = new ImageIcon("D:\\eclipse\\workspace\\學(xué)生信息管理系統(tǒng)\\Pictures\\8463593.jpg");g.drawImage(image.getImage(), 0, 0, getWidth(), getHeight(), image.getImageObserver());}};panel1.setLayout(null);//取消背景板布局//加入組件panel1.add(label1);panel1.add(label2);panel1.add(text);panel1.add(password);panel1.add(button);//設(shè)置組件位置label1.setBounds(180, 200, 40, 20);text.setBounds(230, 200, 125, 20);label2.setBounds(180, 230, 40, 20);password.setBounds(230, 230, 125, 20);button.setBounds(260, 276, 60, 20);//加入窗口jf.add(panel1);jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);jf.setVisible(true);//為登錄按鈕設(shè)置監(jiān)聽器button.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {String inputstr1 = text.getText().trim();String inputstr2 = password.getText().trim();if (inputstr1.equals("") && inputstr2.equals("")) {jf.dispose();new ManagerFrame();} else {JOptionPane.showConfirmDialog(null, "賬戶或密碼錯(cuò)誤", "溫馨提示", JOptionPane.CLOSED_OPTION);}}});}public static void main(String[] args) {new login();} }焦點(diǎn)獲取(花里胡哨)
jf.addWindowFocusListener(new WindowFocusListener() {@Overridepublic void windowLostFocus(WindowEvent e) {// TODO Auto-generated method stubjf.dispose();}@Overridepublic void windowGainedFocus(WindowEvent e) {// TODO Auto-generated method stubSystem.out.println("點(diǎn)擊窗口區(qū)域");}});審計(jì)(簡(jiǎn)易版)
public void Audit(String sql) throws Exception {// TODO Auto-generated method stubFile file=new File("D:\\eclipse\\workspace\\學(xué)生信息管理系統(tǒng)\\Audit\\數(shù)據(jù)庫(kù)審計(jì)文檔.txt");FileOutputStream out=new FileOutputStream(file,true);String str=sql;//分隔符String strline="***********************************\r\n";str+="\r\n";//時(shí)間Date date =new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH時(shí)mm分ss秒:\n");String time=sdf.format(date);out.write(time.getBytes());out.write(str.getBytes());out.write(strline.getBytes());out.close();}前后端的連接
public class DbProcess{Connection connection = null;ResultSet rs = null;//mysql數(shù)據(jù)庫(kù)urlString userMySql="root"; String passwordMySql="數(shù)據(jù)庫(kù)的密碼";//String urlMySql="jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT";String urlMySql = "jdbc:mysql://localhost:3306/db_test?user="+userMySql+"&password="+passwordMySql + "&useUnicode=true&characterEncoding=gbk&useSSL=false&serverTimezone=GMT"; //如果是使用MySQL5.0版本,則 //String urlMySql = "jdbc:mysql://localhost:3306/db_test?user="+userMySql+"&password="+passwordMySql + "&useUnicode=true&characterEncoding=gbk";//sqlserver數(shù)據(jù)庫(kù)url//String urlSqlServer = "jdbc:sqlserver://localhost:1433;integratedSecurity=true;DatabaseName=InfoDb";public DbProcess() {try {//mysql數(shù)據(jù)庫(kù)設(shè)置驅(qū)動(dòng)程序類型Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("mysql數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功"); //如果是MySQL5.0版本,則去掉.cj//sqlserver數(shù)據(jù)庫(kù)設(shè)置驅(qū)動(dòng)程序類型//Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//System.out.println("sqlserver數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載成功");}catch(java.lang.ClassNotFoundException e) {e.printStackTrace();}}public void connect(){try{//mysql數(shù)據(jù)庫(kù)connection = DriverManager.getConnection(urlMySql); //sqlserver數(shù)據(jù)庫(kù)//connection = DriverManager.getConnection(urlSqlServer);if(connection!=null){System.out.println("數(shù)據(jù)庫(kù)連接成功");}}catch(Exception e){e.printStackTrace();}}public void disconnect(){try{if(connection != null){System.out.println("數(shù)據(jù)庫(kù)連接斷開");connection.close();connection = null;}}catch(Exception e){e.printStackTrace();}}public ResultSet executeQuery(String sql) {try {System.out.println("executeQuery(). sql = " + sql);PreparedStatement pstm = connection.prepareStatement(sql);// 執(zhí)行查詢r(jià)s = pstm.executeQuery();} catch(SQLException ex) { ex.printStackTrace();}return rs;}//插入//executeUpdate 的返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。//executeUpdate用于執(zhí)行 INSERT、UPDATE 或 DELETE 語(yǔ)句//以及 SQL DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句,例如 CREATE TABLE 和 DROP TABLE。//執(zhí)行增、刪、改語(yǔ)句的方法public int executeUpdate(String sql) {int count = 0;connect();try {Statement stmt = connection.createStatement();count = stmt.executeUpdate(sql);} catch(SQLException ex) { System.err.println(ex.getMessage());}disconnect();return count;} }結(jié)果
基本上實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的基本操作和簡(jiǎn)單的審計(jì)功能。
但是,但是!存在一些小小的問(wèn)題,比如所有學(xué)生必須有獎(jiǎng)勵(lì)又有處罰才能在“學(xué)生信息查詢”中被找到,所以我又偷偷摸摸在前面的查詢表格中加入了查詢功能,其實(shí)可以把“學(xué)生信息查詢”的表格簡(jiǎn)化,在其他表格中構(gòu)建如老師案例的表。又或者在沒(méi)有處罰和獎(jiǎng)勵(lì)的情況下強(qiáng)制填入無(wú)(還有待改良)。
效果圖
小結(jié)
不管怎么說(shuō),這一次的課設(shè)確實(shí)讓我學(xué)到了很多東西,雖然自己還是菜菜的,不過(guò)問(wèn)題不大,在今后的學(xué)習(xí)生活中,還要繼續(xù)努力哦!
源代碼
鏈接:https://pan.baidu.com/s/1q3mN5a6fhzCZUrFlFd3HFA
提取碼:1lfb
總結(jié)
以上是生活随笔為你收集整理的【记录贴】数据库课程设计——学生信息管理系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用PHP写一个学生学籍管理系统
- 下一篇: Redis主从原理+哨兵模式