课程设计-个人博客
面向对象设计-个人博客
1.团队博客链接:
https://www.cnblogs.com/linfangnan/p/14342181.html
2.参考git地址:
https://gitee.com/black_lacquer_white_moon/jmu-online-judge
git提交截图
3.个人任务简述:
4.个人任务详解:
1.面向对象设计
主要负责设计了基本题目类,选择题类,判断题类,主观题,以及题目集实体类设计。以及其数据存储方式DAO接口和实现方式。
主要设计思路:
-
① 基本题目类为所有题目类型的父类,包含基本属性。选择题和判断题主要属性是应包含选项。而主观题和编程题无需答案这一属性
-
② 关于分值:主观题和编程题特有分值属性,而选择题和判断题总分设计在题目集中,方便裁判机判分。
-
③ *题目集设计:需包含所有类型题目。包含所有题目类型的Id序列 和对象集。
具体代码展示:
1)Exericise基本题目类:属性应包含 题目编号(保证题目的唯一性)和 题干信息
2)JudgmentQuestion判断题类:属性中题目答案 (0/1 表示题目正确与否)
3)ChoiceQuestion选择题类: 属性中选项(定义为List
4)SubjectiveQuestion主观题类:属性应包含分值
5)ExerciseCollection题目集类:选择题分值和判断题分值统一设定。
2.数据库存储交互部分
1)*数据库表设计
① 同种题目类型的题目信息都放在同一张表中:
题目类数据库实现类 可以从表中获取对象信息,可以存储信息进表中,可以删除选择题题目信息。
② 各类型题目类和题目集类表联系:
题目集类表中存储了存有四种类型题目的id序列。
而获取具体的题目内容,则需要从对应的表中读取内容。
即题目集先获取题目所有题目Id,再通过调用各类型题目接口获取题目对象的方法来获取所有题目内容
③ 班级管理表:
老师创建班级,和学生加入班级记录都存储在一张图中。type区分是老师还是学生。
学生和老师关于班级管理的方法都使用同一张表,因此定义在一个DAO接口中。
④ score表存储学生的成绩
通过题集id和班级id确定该学生该帮该题集所获得的唯一分数
老师可通过班级id和题集id获得该班所有学生的成绩
而学生可通过自己的用户名获取自己所有题集的分数
⑤ task表记录班级所有的题集
⑥ testpoint表用于存储编程题的测试样例
⑦ answer表则用于存储主观题答案
⑧ Emails用于存储站内短消息
⑨ users存储用户登入信息
2.数据库中存储信息,DAO接口定义获取、删除、存储的基本方法。
实现难度:就是实体类多,要存储的数据多,就算是只写基本方法也是要花很多时间的,因为都要根据根据具体的类结构对应数据库表进行修改。
每个接口至少为三个基本方法。这里以题目类选择题为例:数据库实现类获取选择题ID序列方法,以及获取选择题内容信息,和删除选择题的内容信息
具体实现代码展示:
根据数据库设计,每种题型各为一张表,存储该题型题目的对象内容。
如获取选择题内容,返回选择题类型对象的方法:使用SQL语句,由于同一题型是在同一张表中,因此是都在同一张表中搜查,为了不频繁的开闭资源,因此方法写批量处理,利用SQL的预编译命令。
获取选择题对象集方法:
编辑题目后,将题目内容信息存入数据库中的方法:
题目信息错误,需要删除数据库中记录方法:
代码展示
package dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import dao.ChoiceDAO;
import dao.ClassesRepositoryDAO;
import model.ChoiceQuestion;
import util.MysqlConnect;
/**
* 基于 MySQL 实现的 ChoiceDAO接口
* @author ZML
* @version 1.0
*/
public class ChoiceDaoJDBCImpl implements ChoiceDAO{
/**
* 基于 MySql 数据库实现的getData() 方法,
* 该方法用于获取数据库中的选择题类型题集,返回List的该对象集。
* @param choiceQuestionsId 选择题题号序列,List<Integer>
* @return 选择题对象集 :List<ChoiceQuestion>
*/
@Override
public List<ChoiceQuestion> getData(List<Integer> choiceQuestionsId) { // 获取选择题对象
List<ChoiceQuestion> choiceQuestions = new ArrayList<>();//要返回的对象集
Connection con = null; //创建 Connection 数据库连接对象
ResultSet rs = null; // 创建 ResultSet 结果集对象
PreparedStatement pStatement=null;//预编译的SQL语句对象
String strSql = "select*from choice where Id=?;";
try {
con = MysqlConnect.connectDatabase();
pStatement = con.prepareStatement(strSql);
// 在表中根据选择题题号依次查找
for (Integer i : choiceQuestionsId) {
pStatement.setInt(1, i);//设置要查找的题号
rs = pStatement.executeQuery();
while (rs.next()) {
// 获取该题目对象
ChoiceQuestion q = new ChoiceQuestion();
q.setId(rs.getInt("id"));
q.setText(rs.getString("text"));
q.setAnswer(rs.getString("answer"));
//处理选项字符串
if(rs.getString("options")!=null) {
String[] s=rs.getString("options").split("!");//!号分隔
List<String>options=Arrays.asList(s);
q.setOptions(options);
}else {
q.setOptions(null);
}
// 存储进选择题对象列表
choiceQuestions.add(q);
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
MysqlConnect.close(rs);
MysqlConnect.close(pStatement);
MysqlConnect.close(con);
}
// 返回获取的选择题对象列表
return choiceQuestions;
}
/**
* 基于 MySql 数据库实现的storeData() 方法,
* 该方法用于向数据库中插入设置的选择题信息,存储数据
* @param choiceQuestions 选择题对象集,List<ChoiceQuestion>
* @return 插入是否都成功 boolean
*/
@Override
public boolean storeData(List<ChoiceQuestion> choiceQuestions) {
Connection con = null; //创建 Connection 数据库连接对象
PreparedStatement pStatement=null;
String strSql = "insert into choice(text,options,answer) values(?,?,?)";
try {
con = MysqlConnect.connectDatabase();
pStatement = con.prepareStatement(strSql);
// 遍历所有选择题对象
for (ChoiceQuestion c : choiceQuestions) {
//处理选项整合成字符串
String optionStr=c.getOptions().get(0);
for (int j = 1; j < c.getOptions().size(); j++) {
optionStr = optionStr+"!"+(c.getOptions().get(j));//!号分隔
}
//设置SQL语句参数
pStatement.setString(1, c.getText());
pStatement.setString(2,optionStr);
pStatement.setString(3, c.getAnswer());
pStatement.addBatch();//将当前参数加入对象列表
}
int[] num=pStatement.executeBatch();//将一批命令提交给数据库执行
for (int i : num) {
if(i==0) { //若有出现插入失败的题目则返回false
return false;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
MysqlConnect.close(pStatement);
MysqlConnect.close(con);
}
// 返回获取的选择题对象列表
return true;
}
/**
* 基于 MySql 数据库实现的deleteData() 方法,
* 该方法用于向数据库中删除选择题信息。 当错误信息,重新设置时可能用到
* @param choiceQuestionsId 要删除的选择题题号序列,List<Integer>
* @return 删除是否都成功 boolean
*/
@Override
public boolean deleteData(List<Integer> choiceQuestionsId) {
int[] num;
Connection con = null; //创建 Connection 数据库连接对象
PreparedStatement pStatement=null;//预编译的SQL语句对象
String strSql = "delete from choice where Id=?;";
try {
con = MysqlConnect.connectDatabase();
pStatement = con.prepareStatement(strSql);
// 在表中根据选择题题号依次查找
for (Integer i : choiceQuestionsId) {
pStatement.setInt(1, i);//设置要查找的题号
pStatement.addBatch();
}
num = pStatement.executeBatch();
for (int i : num) {
if(i==0) {
return false;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
MysqlConnect.close(pStatement);
MysqlConnect.close(con);
}
return true;
}
}