文章目录
主要实现了简单的学生考试答题系统
- 上一篇写的是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"));
}
}
}
正在尝试写博客,如有写的不好,请评论,谢谢!