在线OJ系统--第二章(业务层编写)

本文详述了在线判题系统(OJ)的业务层编写,包括题目管理模块的数据库设计、数据库连接、数据访问层DAO实现。讨论了服务器API的设计,如JSON处理和前后端交互,以及如何处理编译运行代码的请求。同时,分享了部署与测试的实用技巧,如使用Servlet处理HTTP请求,解决Tomcat中的404问题,以及利用Postman测试POST请求。
摘要由CSDN通过智能技术生成

题目管理模块

数据库设计

根据LeetCode刷题的页面来看,对于题目表的设计应该有以下关键字:主键、标题、难度级别、题目描述、题目模板代码和测试用例。

create table oj_table(
	id int primary key auto_increment,   //主键
	title varchar(50),   //标题
	level varchar(50),   //难度级别
	description text,    //题目描述
	templateCode text,   //题目模板代码
	testCode text        //测试用例
);

数据库表对应表示关系:

在这里插入图片描述

注:主要要思考的是测试用例,其实测试用例都是我们自己去编写判定的,不同的题目,给定不同的测试用例,不过也并不难,无非就是if/else的判定。

数据库连接

其实这里用mybatis非常方便,但是就当做复习,就直接用原生jdbc了。

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//借助这个类和数据库建立连接,进一步的操作数据库
public class DBUtil {
   
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/system_oj?characterEncoding=utf8&useSSL=true";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    private static volatile DataSource dataSource = null;

    private DBUtil(){
   }

    public static DataSource getDataSource(){
   
        if (dataSource == null) {
   
            synchronized (DBUtil.class) {
   
                if(dataSource == null){
   
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setUrl(URL);
                    ((MysqlDataSource)dataSource).setUser(USERNAME);
                    ((MysqlDataSource)dataSource).setPassword(PASSWORD);
                }
            }
        }
        return dataSource;
    }

    public static Connection getConection(){
   
        try {
   
            return getDataSource().getConnection();
        } catch (SQLException throwables) {
   
            throwables.printStackTrace();
        }
        return null;
    }

    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
   
        try {
   
            if(resultSet != null){
   
                resultSet.close();
            }
            if(statement != null){
   
                statement.close();
            }
            if(connection != null){
   
                connection.close();
            }
        } catch (SQLException throwables) {
   
            throwables.printStackTrace();
        }
    }
}

注:主要注意两点,一:获取dataSource是单例的,用到双重校验锁;二:关闭资源是反向关闭。

建立Model

与数据库对应实体类

//实体类,每个Problem对象就对应到system_oj中的一条记录
public class Problem {
   
    private int id;
    private String title;
    private String level;
    private String description;
    private String templateCode;
    private String testCode;

    public int getId() {
   
        return id;
    }

    public void setId(int id) {
   
        this.id = id;
    }

    public String getTitle() {
   
        return title;
    }

    public void setTitle(String title) {
   
        this.title = title;
    }

    public String getLevel() {
   
        return level;
    }

    public void setLevel(String level) {
   
        this.level = level;
    }

    public String getDescription() {
   
        return description;
    }

    public void setDescription(String description) {
   
        this.description = description;
    }

    public String getTemplateCode() {
   
        return templateCode;
    }

    public void setTemplateCode(String templateCode) {
   
        this.templateCode = templateCode;
    }

    public String getTestCode() {
   
        return testCode;
    }

    public void setTestCode(String testCode) {
   
        this.testCode = testCode;
    }

    @Override
    public String toString() {
   
        return "Problem{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", level='" + level + '\'' +
                ", description='" + description + '\'' +
                ", templateCode='" + templateCode + '\'' +
                ", testCode='" + testCode + '\'' +
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值