Java + MySQL 实现学生考试系统

主要实现了简单的学生考试答题系统

  • 上一篇写的是Java读取txt文本文件现实的考试系统,但是因为txt文件读取比较麻烦,所以这里用了数据库的方法,其实就是换了一下主程序中的createExam方法,其他的地方基本都是一样的
  • 用到的工具有MySQL和Navicat,这里用的是数据库可视化工具Navicat,也可以直接用mysql,但是个人觉得用惯可视化工具之后感觉比较好用

数据库设计

在这里插入图片描述

  • Java连接连接MySQL数据库还需要添加一个mysql-connector-java.jar这样的驱动,具体下载和用法可以从网上下载

Java 与 MySQL 的连接驱动 jar

在这里插入图片描述

试题类

下面是源代码,跟文本文件一样有个Testquestion类

public class Testquestion {
	private  String questionText ="";//定义题目
	private String standardkey = "";// 定义正确答案
	private String  selectKey ="";// 定义输入答案
	public Testquestion(String questionText, String standardkey) {
		super();
		this.questionText = questionText;
		this.standardkey = standardkey;
	}
	public String getQuestionText() {
		return questionText;
	}
	public void setQuestionText(String questionText) {
		this.questionText = questionText;
	}
	public String getStandardkey() {
		return standardkey;
	}
	public void setStandardkey(String standardkey) {
		this.standardkey = standardkey;
	}
	public String getSelectKey() {
		return selectKey;
	}
	public void setSelectKey(String selectKey) {
		this.selectKey = selectKey;
	}
	public boolean check() {
		if (this.selectKey.equals(this.standardkey)) {
			return true;
			}
		else {
			return false;
			}
		}	
	}

主程序源码

import java.awt.*;
import java.sql.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Test3 extends JFrame implements ActionListener{
	
	private JButton start,commit,back,next;
	private JRadioButton aButton,bButton,cButton,dButton;
	private ButtonGroup buttonGroup;
	private JLabel label,clock;
	private  JTextArea jTextArea;
	private JPanel panel,panel2,panel3;
	Testquestion t1;
	Testquestion[] questions;
	int examtime;
	int p=0;//设置题目数指针           
	int topicnum=0;
	int right,error;                                                     //答对和答错
	ClockDispaly mt;                                                     //倒计时模块
	
	public Test3(){
		
		this.setTitle("学生在线考试系统v1");                                   //设置标题
		this.setSize(440,320);                                           //设置窗口大小
		this.setLocationRelativeTo(null);                                //设置显示位置居中
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             //设置关闭时关闭
		
		panel = new JPanel();                                            //初始化面板
		panel2 = new JPanel();
		panel3 = new JPanel();
		label = new JLabel("总考试时间:100分钟 ");                             //初始化并命名标签
		clock = new JLabel();
		jTextArea = new JTextArea(10,35);                                //初始化文本区域
		jTextArea.setEditable(false);                                    //设置文本不可修改
		
		aButton =  new JRadioButton("A");                                //初始化单选按钮
		bButton =  new JRadioButton("B");
		cButton =  new JRadioButton("C");
		dButton =  new JRadioButton("D");
		buttonGroup = new ButtonGroup();                                 //初始化选项组
		
		start = new JButton("开始考试");                                   //初始化按键
		back = new JButton("上一题");
		next  = new JButton("下一题");
		commit = new JButton("提交考试");
		
		aButton.addActionListener(this);                              //单选按钮添加监听事件
		bButton.addActionListener(this);
		cButton.addActionListener(this);
		dButton.addActionListener(this);
		
		start.addActionListener(this);                                //按钮添加监听事件
		back.addActionListener(this);
		next.addActionListener(this);
		commit.addActionListener(this);
		
		
		buttonGroup.add(aButton);                                     //把单选按钮放到选项组
		buttonGroup.add(bButton);
		buttonGroup.add(cButton);
		buttonGroup.add(dButton);
		
		panel.add(label);                                             //把标签放入面板panel
		panel.add(clock);
		panel.add(start);                                             //把按键放入面板panel
		panel2.add(jTextArea);                                        //把文本区域放入面板panel2
		panel3.add(aButton);                                          //把单选按钮放入面板panel3
		panel3.add(bButton);
		panel3.add(cButton);
		panel3.add(dButton);
		panel3.add(back);                                             //把按键放入面板panel3
		panel3.add(next);
		panel3.add(commit);	
		
		this.add(panel,BorderLayout.NORTH);                           //设置面板panel放在上面
		this.add(panel2,BorderLayout.CENTER);                         //设置面板panel2放在中间
		this.add(panel3, BorderLayout.SOUTH);                         //设置面板panel放在下面
		
		this.setVisible(true);                                        //设置窗口可见
		
		mt = new ClockDispaly(clock, 30);                            //调用并设置倒计时的时间
	}
	
	public void createExam()
	{
		Testquestion t=null;
		String questionText="";
		String standardKey="";
		
		Vector <Testquestion> qList=new Vector <Testquestion>(); 
		//读取试题文件,获取考试时间和题目等内容
		Connection conn = null;
		Statement stmt = null;
		try {
			//Class.forName("com.mysql.jdbc.Driver");
			String dbURL = "jdbc:mysql://localhost:3306/数据库名?useSSL=false";//驱动加载
			String dbUser = "root"; //数据库用户名
			String dbPassword = "";	//密码
			conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
			System.out.println("JDBC驱动程序连接数据库成功!");
			stmt=conn.createStatement(); //创建连接方法
		} 
		catch (Exception e){
			e.printStackTrace();//打印异常信息
		}
	
		try {
			String sSQL = "SELECT *  FROM  test_db";//查询数据库表信息
			ResultSet rs = stmt.executeQuery(sSQL);//接收
			while (rs.next()){   //读取
				//System.out.print(rs.getString("tm")+"     ");
				questionText=rs.getString("topic")+'\n'+rs.getString(3)+'\n'+rs.getString(4)+'\n'+rs.getString(5)+'\n'+rs.getString(6)+'\n';//获取表的列
				standardKey=rs.getString("answer");				
				t=new Testquestion(questionText,standardKey);
				qList.add(t);
	      }
	    }
	    catch(SQLException e){
	       System.out.println(e.getMessage());

	    }
		
		topicnum=qList.size();//确定题目数量
		questions=new Testquestion[topicnum];
		for (int i=0;i<qList.size();i++) {
			questions[i]=(Testquestion)qList.get(i);			
		}		
	}
	
	public void setSelected(String s) {//设置单选按钮不重复模块
		if (s.equals("A")) buttonGroup.setSelected(aButton.getModel(), true);
		if (s.equals("B")) buttonGroup.setSelected(bButton.getModel(), true);
		if (s.equals("C")) buttonGroup.setSelected(cButton.getModel(), true);
		if (s.equals("D")) buttonGroup.setSelected(dButton.getModel(), true);
		if (s.equals("")) buttonGroup.clearSelection();
	}
	
	public void showQuestion() {//设置试题模块
		jTextArea.setText("");
		jTextArea.append(questions[p].getQuestionText());//在文本区域显示试题
		setSelected(questions[p].getSelectKey());
	}
	
	public void showScore() {//设置成绩模块
		right=0;error=0;
		for (int i = 0; i < topicnum; i++) {
			if (questions[i].check()) {//判断答案的正确与错误
				right++;
			}else {
				error++;
			}
		}
		int score = (int)(right*100/topicnum);            //设置分数
		JOptionPane.showMessageDialog(null, "答对"+right+"题,答错"+error+"题,分数为"+score);
	}
		

	@Override
	public void actionPerformed(ActionEvent e) {//动作监听事件
		
		if (e.getSource()==start) {//开始开始按键实现
			createExam();          //调用createExam模块
			p=0;                   //题目序号
			showQuestion();        //调用showQuestion模块
			start.setEnabled(false);//设置按钮不可点击
			mt.start();             //考试时间倒计时启动
		}
		if (e.getSource()==back) {//上一题的按键实现
			p--;
			if (p==-1) {
				JOptionPane.showMessageDialog(null, "已经是第一题");
				p++;
			}
			showQuestion();
		}
		if (e.getSource()==next) {//下一题的按键实现
			p++;
			if (p==topicnum) {
				JOptionPane.showMessageDialog(null, "已经是最后一题");
				p--;
			}
			showQuestion();
		}
		if (e.getSource()==commit) {//提交试卷的按键实现
			showScore();
			commit.setEnabled(false);
			System.exit(0);          //退出
		}
		
		if(e.getSource()==aButton) questions[p].setSelectKey("A");
		if(e.getSource()==bButton) questions[p].setSelectKey("B");
		if(e.getSource()==cButton) questions[p].setSelectKey("C");
		if(e.getSource()==dButton) questions[p].setSelectKey("D");
		
	}
	
	public static void main(String[] args) {
		new Test3();
	}
}

class ClockDispaly extends Thread{//设置Thread考试倒计时模块
	
	private JLabel lefttimer;
	private int testtime;
	
	public ClockDispaly(JLabel lt,int time) {
		lefttimer = lt;
		testtime = time * 60;
	}
	public void run(){
		NumberFormat numberFormat = NumberFormat.getInstance();//控制时间的显示格式
		numberFormat.setMinimumIntegerDigits(2);//设置数值的整数部分允许的最小位数
		int h,m,s;//定义时分秒
		while (testtime >= 0) {
			h = testtime / 3600;
			m = testtime % 3600 / 60;
			s = testtime % 60;
			StringBuffer stringBuffer = new StringBuffer("");
			//增加到lefttimer标签
			stringBuffer.append("考试剩余时间为:"+numberFormat.format(h)+":"+numberFormat.format(m)+":"+numberFormat.format(s));
			lefttimer.setText(stringBuffer.toString());
			try {
				Thread.sleep(1000);//延时一秒
			} catch (Exception e) {
				//ignore error
			}
			testtime = testtime - 1; 
		}
		if (testtime <= 0) {
			JOptionPane.showMessageDialog(null, "考试结束");
			System.exit(0);
		}
	}
}

最终效果

效果图和文件读取是一样的,只是数据库操作比较方便而且容易操作
在这里插入图片描述

  • 注: 连接数据库的时候可能会遇到这种情况,会有下面这样的报错

在这里插入图片描述

  • 去网上找了一下问题发现要在String dbURL = "jdbc:mysql://localhost:3306/数据库名;//驱动加载数据库名后面加一句?useSSL=false
  • 如String dbURL = “jdbc:mysql://localhost:3306/数据库名?useSSL=false”;添加完之后就不会报错了
    在这里插入图片描述

附:完整 Java 连接 MySQL 代码

import java.sql.*;

/**
 * @author Woo_home
 * @create 2020/6/9 20:33
 */

public class JDBCUtil {

    // 驱动名称
    // 这里需要注意的是:如果你的 jar 是 8.0 以上的那么驱动名如下:
    private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
    // 如果 jar 是 8.0 以下的,那么驱动名如下:(只需要将 cj 删除即可)
    // private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";

    // 数据库连接地址
    private static final String URL = "jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC";

    // 用户名
    private static final String USERNAME = "用户名";

    // 密码
    private static final String PASSWORD = "密码";

    // 获取连接接口
    private static Connection connection;

    // 数据库操作接口
    private static Statement statement;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 注册驱动名
        Class.forName(DRIVER_NAME);
        System.out.println("正在连接数据库......");

        // 获取数据库连接
        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

        // 创建 Statement
        statement = connection.createStatement();

        System.out.println("连接成功");

        // SQL 语句
        String sql = "select * from student";

        // 指定查询获取结果集
        ResultSet result = statement.executeQuery(sql);

        // 打印结果集
        while (result.next()) {
            System.out.print(result.getInt("id") + "\t");
            System.out.println(result.getString("name"));
        }

    }
}

正在尝试写博客,如有写的不好,请评论,谢谢!

关注我的公众号,一起进步

在这里插入图片描述

  • 40
    点赞
  • 214
    收藏
    觉得还不错? 一键收藏
  • 67
    评论
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值