1.课设要求描述
●实现部门、职称、职务的基本信息的管理;
●实现教师信息的管理;
●实现教师家庭关系和教育经历的管 理;
●实现教师的奖惩管理;
●创建规则使得教师的 E-Mail必须符合电子邮箱的格式;
●创建触发器,实现修改教师所在部门时自动修改相应部门的教师人数:
●创建存储过程统计各 部门各种职称的人数;
●建立数据库相关表之间的参照完整性约束
2.制作思路及基础讲解
此项目主要是用于完成大二下半学期的数据库课设,随手记录。技术面大二下之前只学过Java,MySQL/SQLServer。所以此项目没有前端界面,只通过命令行的形式来操作该系统,制作思路:首先是数据库作为存储数据的地方,编写根据课设要求编写好对应的建表语句和存储过程,视图,触发器等。然后编写好对应系统的Java代码,最后通过JDBC将Java代码与数据库连接起来。
部分学生可能学的比较浅,不理解mysql,sqlserver,java,c等一堆名词之间的含义。之前有同学找我做过这类似的课设。问的问题都比较抽象,例如用mysql做一个系统之类的。在此简单说一下我对于这些的理解,mysql,sqlserver都是数据库的一种,只不过是外国的所以都是用英文表示,大部分上课不听的同学看到这一堆英文都会比较懵,其实只需简单把数据库(mysql,SQLServer)理解成存储数据的地方,而java,c等语言是用来编写系统逻辑功能的代码。当然在数据库中的存储过程或者触发器什么的,这些功能也能在代码编程语言中通过特定的逻辑实现类似的功能,只不过我们在数据库中写好的话,免去了Java中代码的编写量,并且查询时速度会更快。
3.使用工具及语言详解
不同的学校要求不同,有的是sqlserver,有的是mysql,但其实这两者的区别在我看来区别不大,大部分的语句格式都是一样的,所以我选择了我熟悉的一种,mysql来进行编写。在语言方面,我大一的时候学过c,但是当时没有认真听,后来也慢慢都忘了,大二时学了Java,并且之后又系统性的学了一遍,所以选择来用Java语言编写。对于编译器我使用的是IDEA,版本随意,这个不影响,但需要注意IDEA不是免费的,可以去试用30天,也可以自行网上找方法安装破解版。数据库可视化工具使用的是Navicat,这个工具同样也不是免费的,但提供14天试用期,有长期需求也需要各位自行找破解版。
PS:这里又提到两个新名词,IDEA和Navicat,这不是编程语言,而是工具的名字,大家需要慢慢熟悉这些名词,简单来说就是他能让你的编程之路变得更顺畅,提供了可视化的界面,不需要一直在黑窗口中输入代码。
4.数据库建表代码
-- 创建存储过程统计各 部门各种职称的人数;
CREATE PROCEDURE CountTitlesByDepartment()
BEGIN
-- 临时表存储统计结果
DROP TEMPORARY TABLE IF EXISTS DepartmentTitleCounts;
CREATE TEMPORARY TABLE DepartmentTitleCounts (
DepartmentName VARCHAR(255),
TitleName VARCHAR(255),
Count INT
);
-- 插入统计结果
INSERT INTO DepartmentTitleCounts (DepartmentName, TitleName, Count)
SELECT
d.DepartmentName,
t.TitleName,
COUNT(t2.TitleID)
FROM
Teachers t
JOIN
Departments d ON t.DepartmentID = d.DepartmentID
JOIN
Titles t2 ON t.TitleID = t2.TitleID
GROUP BY
d.DepartmentName,
t2.TitleName;
-- 选择临时表中的数据,以便查看结果
SELECT * FROM DepartmentTitleCounts;
END
-- 创建触发器,实现修改教师所在部门时自动修改相应部门的教师人数:
CREATE TRIGGER AfterTeacherDepartmentUpdate
AFTER UPDATE ON Teachers
FOR EACH ROW
BEGIN
-- 如果教师的部门ID发生了变化
IF OLD.DepartmentID <> NEW.DepartmentID THEN
-- 减少原部门的教师人数
UPDATE Departments SET TeacherCount = TeacherCount - 1
WHERE DepartmentID = OLD.DepartmentID;
-- 增加新部门的教师人数
UPDATE Departments SET TeacherCount = TeacherCount + 1
WHERE DepartmentID = NEW.DepartmentID;
END IF;
END
-- 创建部门表
CREATE TABLE Departments (
DepartmentID INT AUTO_INCREMENT PRIMARY KEY,
DepartmentName VARCHAR(255) NOT NULL,
Description TEXT
);
-- 创建职称表
CREATE TABLE Titles (
TitleID INT AUTO_INCREMENT PRIMARY KEY,
TitleName VARCHAR(255) NOT NULL
);
-- 创建职务表
CREATE TABLE Positions (
PositionID INT AUTO_INCREMENT PRIMARY KEY,
PositionName VARCHAR(255) NOT NULL
);
-- 创建教师信息表
CREATE TABLE Teachers (
TeacherID INT AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
Gender VARCHAR(10),
BirthDate DATE,
Email VARCHAR(255) NOT NULL CHECK (Email LIKE '%_@_%.__%'),
DepartmentID INT,
TitleID INT,
PositionID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID),
FOREIGN KEY (TitleID) REFERENCES Titles(TitleID),
FOREIGN KEY (PositionID) REFERENCES Positions(PositionID)
);
-- 创建家庭关系表
CREATE TABLE FamilyRelations (
RelationID INT AUTO_INCREMENT PRIMARY KEY,
TeacherID INT NOT NULL,
RelationType VARCHAR(100) NOT NULL,
RelationName VARCHAR(255) NOT NULL,
RelationBirthDate DATE,
FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID)
);
-- 创建教育经历表
CREATE TABLE EducationalExperiences (
ExperienceID INT AUTO_INCREMENT PRIMARY KEY,
TeacherID INT NOT NULL,
InstitutionName VARCHAR(255) NOT NULL,
DegreeObtained VARCHAR(255),
StartDate DATE NOT NULL,
EndDate DATE,
FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID)
);
-- 创建奖惩信息表
CREATE TABLE RewardsPunishments (
RewardPunishmentID INT AUTO_INCREMENT PRIMARY KEY,
TeacherID INT NOT NULL,
Description TEXT NOT NULL,
Date DATE NOT NULL,
Type VARCHAR(50) NOT NULL, -- 改为VARCHAR类型
FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID)
);
5.Java代码思路及结构
此处只放部分代码截图