DBUtil
package common;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/xxx?characterEncoding=utf8&useSSL=false";private static final String USERNAME = "xxx";private static final String PASSWORD = "xxx";private static volatile DataSource dataSource = null;private static DataSource getDataSource() {if (dataSource == null) {synchronized (DBUtil.class) {if (dataSource == null) {MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(URL);mysqlDataSource.setUser(USERNAME);mysqlDataSource.setPassword(PASSWORD);dataSource = mysqlDataSource;}}}return dataSource;}public static Connection getConnection() throws SQLException {return getDataSource().getConnection();}public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
xxxDAO
public class ProblemDAO {public void insert(Problem problem) {Connection connection = null;PreparedStatement statement = null;try {// 1. 和数据库建立连接connection = DBUtil.getConnection();// 2. 构造 SQL 语句String sql = "insert into xxx values(null, ?, ?, ?, ?, ?)";statement = connection.prepareStatement(sql);statement.setString(1, problem.getTitle());statement.setString(2, problem.getLevel());statement.setString(3, problem.getDescription());statement.setString(4, problem.getTemplateCode());statement.setString(5, problem.getTestCode());// 3. 执行 SQLint ret = statement.executeUpdate();if (ret != 1) {System.out.println("题目新增失败!");} else {System.out.println("题目新增成功!");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(connection, statement, null);}}public void delete(int id) {Connection connection = null;PreparedStatement statement = null;try {// 1. 和数据库建立连接connection = DBUtil.getConnection();// 2. 拼装 SQL 语句String sql = "delete from xxx where id = ?";statement = connection.prepareStatement(sql);statement.setInt(1, id);// 3. 执行 SQLint ret = statement.executeUpdate();if (ret != 1) {System.out.println("删除题目失败!");} else {System.out.println("删除题目成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {DBUtil.close(connection, statement, null);}}// 这个操作是把当前题目列表中的所有题都查出来了// 万一数据库中的题目特别多, 咋办? 只要实现 "分页查询" 即可. 后台实现分页查询, 非常容易.// 前端传过来一个当前的 "页码" , 根据页码算一下, 依据 sql limit offset 语句, 要算出来 offset 是 几// 但是前端这里实现一个分页器稍微麻烦一些(比后端要麻烦很多). 此处暂时不考虑分页功能.public List<Problem> selectAll() {List<Problem> problems = new ArrayList<>();Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 1. 和数据库建立连接connection = DBUtil.getConnection();// 2. 拼装 SQLString sql = "select id, title, level from xxx";statement = connection.prepareStatement(sql);// 3. 执行 SQLresultSet = statement.executeQuery();// 4. 遍历 resultSetwhile (resultSet.next()) {// 每一行都是一个 Problem 对象Problem problem = new Problem();problem.setId(resultSet.getInt("id"));problem.setTitle(resultSet.getString("title"));problem.setLevel(resultSet.getString("level"));problems.add(problem);}return problems;} catch (SQLException throwables) {throwables.printStackTrace();} finally {DBUtil.close(connection, statement, resultSet);}return null;}public Problem selectOne(int id) {Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 1. 和数据库建立连接connection = DBUtil.getConnection();// 2. 拼接 SQL 语句String sql = "select * from oj_table where id = ?";statement = connection.prepareStatement(sql);statement.setInt(1, id);// 3. 执行 SQLresultSet = statement.executeQuery();// 4. 遍历查询结果. (由于 id 是主键, 按照 id 查找的结果一定是唯一的)if (resultSet.next()) {Problem problem = new Problem();problem.setId(resultSet.getInt("id"));problem.setTitle(resultSet.getString("title"));problem.setLevel(resultSet.getString("level"));problem.setDescription(resultSet.getString("description"));problem.setTemplateCode(resultSet.getString("templateCode"));problem.setTestCode(resultSet.getString("testCode"));return problem;}} catch (SQLException throwables) {throwables.printStackTrace();} finally {DBUtil.close(connection, statement, resultSet);}return null;}