项目源码、文档、数据库脚本下载地址:https://github.com/Chaim16/CurseManager.git
一、描述
1. 数据库“学生管理”中“课程”表如下:
-
用java设计一个应用程序,实现对“课程”表的增、删、改、查。
-
说明文档中有java连接数据库的关键代码说明。
要求:可以运行,实现对学生课程数据库的操作。
二、实现过程及运行结果
-
确定实验操作工具,实验采用java语言,使用Intellij Idea作为编译器,MYSQL来存储数据库,c3p0作为连接池
-
配置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层获取数据源
- 编写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