MENU

java设计课程管理系统(MySQL)

• November 22, 2020 • 小项目

演示视频:

项目源码、文档、数据库脚本下载地址:https://github.com/Chaim16/CurseManager.git

一、描述

​ 1. 数据库“学生管理”中“课程”表如下:

  1. 用java设计一个应用程序,实现对“课程”表的增、删、改、查。
  2. 说明文档中有java连接数据库的关键代码说明。

要求:可以运行,实现对学生课程数据库的操作。

二、实现过程及运行结果

  1. 确定实验操作工具,实验采用java语言,使用Intellij Idea作为编译器,MYSQL来存储数据库,c3p0作为连接池
  2. 配置c3p0-config.xml文件,设置要访问的数据库名和登录用户以及密码

​ 3. 构造大致框架

​ (1)dao层:访问数据库

​ (2)util层:连接数据库

​ (3)image文件夹:存放窗口背景图片

​ (4)model层:存放对象类

​ (5)view层:使用面板,展现结果

​ 4. 下载jar包,并导入到项目的lib文件夹中

​ 5. 在model中创建Course类,有“课程号”、“课程名”、“学分”、“学时”四个成员变量,并生成getter和setter方法

​ 6. 编写JdbcUtils类以及关闭方式等,方便在Dao层获取数据源

  1. 编写dao层代码,实现从数据库抓取、更改记录等操作。根据课程名查询、根据课程号查询、根据课程名删除、根据课程号删除、修改课程信息、添加课程、查询所有课程

源代码及注解:

package dao;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import model.Course;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import util.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.SQLException;
import java.util.List;
/** @author Administrator */
public class CourseDao {
  /** 获取连接池dataSource */
  ComboPooledDataSource comboPooledDataSource = JdbcUtils.dataSource;
  /** 创建queryRunner */
  QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
  /** 根据课程名搜索 */
  public Course search(String name) throws SQLException {
    Course course = null;
    String sql = "select * from 课程 where name = ?";
    // SQL查询  返回一个Bean对象
    course = queryRunner.query(sql, new BeanHandler<Course>(Course.class), name);
    return course;
  }
  /** 根据课程号搜索 */
  public Course search(int id) throws SQLException {
    Course course = null;
    String sql = "select * from 课程 where id = ?";
    // SQL查询  返回一个Bean对象
    course = queryRunner.query(sql, new BeanHandler<Course>(Course.class), id);
    return course;
  }
  /** 查询所有的课程记录 */
  public List<Course> searchAll() throws SQLException {
    List<Course> courses;
    String sql = "select * from 课程";
    // SQL查询  返回List容器
    courses = queryRunner.query(sql, new BeanListHandler<Course>(Course.class));
    return courses;
  }
  /** 增加一条课程记录 */
  public boolean addCourse(Course course) throws SQLException {
    String sql = "insert into 课程(id,name,studyTime, studyGrade) values(?,?,?,?)";
    // SQL查询  返回受影响的行数
    int row =
        queryRunner.update(
            sql, course.getId(), course.getName(), course.getStudyTime(), course.getStudyGrade());
    // 如果受影响的行数为正整数,那么添加记录成功
    if (row > 0) {
      return true;
    } else {
      return false;
    }
  }
  /** 根据id删除一条课程记录 */
  public boolean deleteCourse(int id) throws SQLException {
    String sql = "delete from 课程 where id = ?";
    // SQL查询  返回受影响的行数
    int row = queryRunner.update(sql, id);
    // 如果受影响的行数为正整数,那么删除记录成功
    if (row > 0) {
      return true;
    } else {
      return false;
    }
  }
  /** 根据课程名删除一条记录 */
  public boolean deleteCourse(String string) throws SQLException {
    String sql = "delete from 课程 where name = ?";
    // SQL查询  返回受影响的行数
    int row = queryRunner.update(sql, string);
    // 如果受影响的行数为正整数,那么删除记录成功
    if (row > 0) {
      return true;
    } else {
      return false;
    }
  }
  /** 更改一条记录 */
  public boolean updateCourse(int id, Course course) throws SQLException {
    String sql = "update 课程 set id = ? ,name = ? ,studyTime = ?, studyGrade = ? where id = ?";
    // SQL查询  返回受影响的行数
    int row =
        queryRunner.update(
            sql,
            course.getId(),
            course.getName(),
            course.getStudyTime(),
            course.getStudyGrade(),
            id);
    // 如果受影响的行数为正整数,那么更改记录成功
    if (row > 0) {
      return true;
    } else {
      return false;
    }
  }
}

​ 8. 导入图片到image文件夹,方便后续代码获取主界面背景

​ 9. 设计主界面Window类,继承JFrame类

package view;
import dao.CourseDao;
import model.Course;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
/**
 * @author Administrator
 *     <p>窗口:程序主界面
 */
public class Window extends JFrame {
  CourseDao courseDao = new CourseDao();
  public Window() throws HeadlessException {
    // 设置主界面标题
    this.setTitle("课程管理");
    // 设置窗口弹出居中
    this.setLocationRelativeTo(null);
    // 设置窗口大小
    this.setSize(800, 400);
    // 设置关闭方式为程序退出
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // 窗口布局
    this.setLayout(new BorderLayout());
    // 新建面板,并设置网格布局
    JPanel jPanel = new JPanel();
    jPanel.setLayout(new GridLayout(0, 1));
    // 在窗口左侧添加图片
    JLabel label = new JLabel();
    ImageIcon imageIcon = new ImageIcon("src/image/back2.jpg");
    label.setIcon(imageIcon);
    // 新建操作按钮
    JButton searchAllButton = new JButton("查询所有课程");
    JButton searchIdButton = new JButton("课程号查询");
    JButton searchNameButton = new JButton("课程名查询");
    JButton addButton = new JButton("添加课程");
    JButton deleteIdButton = new JButton("课程号删除");
    JButton deleteNameButton = new JButton("课程名删除");
    JButton updateButton = new JButton("更改课程信息");
    // 设置按钮的大小
    searchAllButton.setSize(50, 30);
    searchIdButton.setSize(50, 30);
    searchNameButton.setSize(50, 30);
    addButton.setSize(500, 30);
    deleteIdButton.setSize(50, 30);
    deleteNameButton.setSize(50, 30);
    updateButton.setSize(50, 30);
    // 查询所有课程 按钮 添加动作监听
    searchAllButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            try {
              // 弹出一个新的查询结果界面
              new SearchAll();
            } catch (SQLException throwables) {
              throwables.printStackTrace();
            }
          }
        });
    // 为根据Id搜索课程 按钮添加动作监听
    searchIdButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            // 直到点击取消按钮或者叉,关闭窗口
            while (true) {
              // 弹出输入框,输入id,类型为String
              String id = JOptionPane.showInputDialog(null, "请输入课程号");
              // 如果没有输入,直接点击取消或者叉
              if (id == null) {
                // 弹出正在取消按钮
                JOptionPane.showMessageDialog(null, "正在取消……", "提示", JOptionPane.WARNING_MESSAGE);
                // 跳出循环,不再弹出窗口
                break;
              }
              // 如果没有输入而点击确认按钮
              else if (id.equals("")) {
                // 弹出提示框:请输入课程号
                JOptionPane.showMessageDialog(null, "未输入课程号!", "提示", JOptionPane.WARNING_MESSAGE);
                // 继续循环
                continue;
              }
              // 有信息输入
              else {
                // 如果输入的是数字串
                if (isDigital(id)) {
                  Course result = null;
                  try {
                    // 将字符串转换成整形数字,查询数据库
                    result = courseDao.search(Integer.parseInt(id));
                  } catch (SQLException throwables) {
                    throwables.printStackTrace();
                  }
                  // 成功查询
                  if (result != null) {
                    // 弹出提示框,展示查询据俄国
                    JOptionPane.showMessageDialog(
                        null, result.getInfo(), "查询结果", JOptionPane.WARNING_MESSAGE);
                  } else {
                    // 没有查询到相关课程
                    JOptionPane.showMessageDialog(
                        null, "未查询到该课程", "查询结果", JOptionPane.WARNING_MESSAGE);
                  }
                }
                // 如果字符串不是数字串
                else {
                  // 弹出提示:输入的不是整型课程号
                  JOptionPane.showMessageDialog(
                      null, "输入的不是整形课程号,请重新输入!", "提示", JOptionPane.WARNING_MESSAGE);
                  continue;
                }
              }
            }
          }
        });
    // 为根据课程名查询 按钮添加动作监听
    searchNameButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            while (true) {
              // 弹出输入框,输入课程名
              String name = JOptionPane.showInputDialog(null, "请输入课程名");
              // 如果点击取消或者叉,弹出正在取消窗口,并退出
              if (name == null) {
                JOptionPane.showMessageDialog(null, "正在取消……", "提示", JOptionPane.WARNING_MESSAGE);
                break;
              }
              // 如果没有输入,点击了确定
              else if (name.equals("")) {
                // 弹出提示框,没有输入课程名
                JOptionPane.showMessageDialog(null, "未输入课程名!", "提示", JOptionPane.WARNING_MESSAGE);
                continue;
              }
              // 如果有输入信息
              else {
                Course result = null;
                try {
                  // 根据课程名查询
                  result = courseDao.search(name);
                } catch (SQLException throwables) {
                  throwables.printStackTrace();
                }
                // 查询成功
                if (result != null) {
                  // 弹出窗口,展示查询结果
                  JOptionPane.showMessageDialog(
                      null, result.getInfo(), "查询结果", JOptionPane.WARNING_MESSAGE);
                } else {
                  // 查询失败,弹出提示框
                  JOptionPane.showMessageDialog(
                      null, "未查询到该课程", "查询结果", JOptionPane.WARNING_MESSAGE);
                }
              }
            }
          }
        });
    // 为新增按钮添加动作监听
    addButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            new AddCourse();
          }
        });
    // 为根据课程号删除  按钮  添加动作监听
    deleteIdButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            while (true) {
              // 弹出窗口,输入课程号
              String id = JOptionPane.showInputDialog(null, "请输入要删除的课程号");
              // 如果点击取消按钮或者叉,弹出正在取消界面
              if (id == null) {
                JOptionPane.showMessageDialog(null, "正在取消……", "提示", JOptionPane.WARNING_MESSAGE);
                break;
              }
              // 如果没有输入而点击确定,弹出提示框
              else if (id.equals("")) {
                JOptionPane.showMessageDialog(null, "未输入课程号!", "提示", JOptionPane.WARNING_MESSAGE);
                continue;
              }
              // 如果有信息输入
              else {
                // 输入的字符串是数字串
                if (isDigital(id)) {
                  boolean result = false;
                  try {
                    // 根据课程号删除课程记录
                    result = courseDao.deleteCourse(Integer.parseInt(id));
                  } catch (SQLException throwables) {
                    throwables.printStackTrace();
                  }
                  // 删除成功
                  if (result) {
                    // 弹出提示框
                    JOptionPane.showMessageDialog(
                        null, "已查询到该课程,删除成功!", "查询结果", JOptionPane.WARNING_MESSAGE);
                  } else {
                    // 没有找到相应的课程  删除失败
                    JOptionPane.showMessageDialog(
                        null, "未查询到该课程,删除失败!", "查询结果", JOptionPane.WARNING_MESSAGE);
                  }
                } else {
                  // 如果输入的不是整形数字串 弹出提示窗口
                  JOptionPane.showMessageDialog(
                      null, "输入的不是整形课程号,请重新输入!", "提示", JOptionPane.WARNING_MESSAGE);
                  continue;
                }
              }
            }
          }
        });
    // 为根据课程名删除添加动作监听
    deleteNameButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            while (true) {
              // 弹出窗口   输入课程名
              String name = JOptionPane.showInputDialog(null, "请输入要删除的课程名");
              // 如果点击取消或者叉
              if (name == null) {
                // 弹出正在取消窗口
                JOptionPane.showMessageDialog(null, "正在取消……", "提示", JOptionPane.WARNING_MESSAGE);
                break;
              }
              // 如果没有输入  而点击了确认
              else if (name.equals("")) {
                // 弹出  输入课程名提示框
                JOptionPane.showMessageDialog(null, "未输入课程名!", "提示", JOptionPane.WARNING_MESSAGE);
                continue;
              }
              // 有信息输入
              else {
                boolean result = false;
                try {
                  // 根据课程名删除课程记录
                  result = courseDao.deleteCourse(name);
                } catch (SQLException throwables) {
                  throwables.printStackTrace();
                }
                // 删除成功
                if (result) {
                  // 成功提示框
                  JOptionPane.showMessageDialog(
                      null, "已查询到该课程,删除成功!", "查询结果", JOptionPane.WARNING_MESSAGE);
                } else {
                  // 没有找到相应课程    删除课程失败
                  JOptionPane.showMessageDialog(
                      null, "未查询到该课程,删除失败!", "查询结果", JOptionPane.WARNING_MESSAGE);
                }
              }
            }
          }
        });
    // 为  更改课程信息  添加动作监听
    updateButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            // 弹出一个新的窗口
            new UpdateCourse();
          }
        });
    // 将各个按钮添加到面板中
    jPanel.add(searchNameButton);
    jPanel.add(searchIdButton);
    jPanel.add(addButton);
    jPanel.add(deleteNameButton);
    jPanel.add(deleteIdButton);
    jPanel.add(updateButton);
    jPanel.add(searchAllButton);
    // 将图片标签添加到窗口
    this.add(label);
    // 将面板添加到窗口的右侧
    this.add(jPanel, BorderLayout.EAST);
    // 设置窗口可见
    this.setVisible(true);
  }
  /** 判断字符串是否为整形数字串 */
  public static boolean isDigital(String string) {
    for (int i = 0; i < string.length(); i++) {
      // 如果不是'0'-'9',则不是数字串,返回false
      if (!(string.charAt(i) >= 48 && string.charAt(i) <= 57)) {
        return false;
      }
    }
    return true;
  }
}

​ 10. 实现课程名查询

// 为根据课程名查询 按钮添加动作监听
searchNameButton.addActionListener(
    new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        while (true) {
          // 弹出输入框,输入课程名
          String name = JOptionPane.showInputDialog(null, "请输入课程名");
          // 如果点击取消或者叉,弹出正在取消窗口,并退出
          if (name == null) {
            JOptionPane.showMessageDialog(null, "正在取消……", "提示", JOptionPane.WARNING_MESSAGE);
            break;
          }
          // 如果没有输入,点击了确定
          else if (name.equals("")) {
            // 弹出提示框,没有输入课程名
            JOptionPane.showMessageDialog(null, "未输入课程名!", "提示", JOptionPane.WARNING_MESSAGE);
            continue;
          }
          // 如果有输入信息
          else {
            Course result = null;
            try {
              // 根据课程名查询
              result = courseDao.search(name);
            } catch (SQLException throwables) {
              throwables.printStackTrace();
            }
            // 查询成功
            if (result != null) {
              // 弹出窗口,展示查询结果
              JOptionPane.showMessageDialog(
                  null, result.getInfo(), "查询结果", JOptionPane.WARNING_MESSAGE);
            } else {
              // 查询失败,弹出提示框
              JOptionPane.showMessageDialog(
                  null, "未查询到该课程", "查询结果", JOptionPane.WARNING_MESSAGE);
            }
          }
        }
      }
    });


注:文中出现 string.equals("")代码是一种不规范的写法,在编写过程中没有注意到,但对程序运行没有影响,因为程序代码不可能使string为null

Archives QR Code Tip
QR Code for this page
Tipping QR Code