数据库实践课程之宿舍管理系统
一、系统需求分析
1.1 系统描述
随着社会的发展以及教育水平的提高,当今社会在校生的数量越来越庞大,使用传统的方式对学生的信息进行管理效率非常低下。在互联网技术高度发达的今天,使用数据库技术对学生的住宿信息进行管理能够使学校对学生信息的管理更加的高效,检索迅速,查找方便,可靠性高,存储量大。此外,使用数据库技术可以使得学生信息出错的可能性大大降低,还可以使学生住宿信息长时间稳定地保存,不易丢失。可见,开发出这样的一个数据库具有很强的显示意义。
1.2 数据存储需求
宿舍管理系统数据库需要存储如下信息:
- 系统管理员的用户名,密码,真实姓名,性别,电话;
- 宿管老师的的用户名,密码,真实姓名,性别,电话;
- 学生的学号,用户名,密码,真实姓名,院系信息,性别,电话;
- 宿舍楼的名称,类型;
- 寝室的名称,大小,现居人数;
- 学生缺寝的日期,原因,登记老师是谁;
- 学生的当前状态(入住还是迁出),以及相应的登记时间。
各种数据之间的关系:
- 寝室与学生是一对多的关系,一个寝室下可有多名学生;
- 宿舍楼与寝室是一对多的关系,一栋宿舍楼下可有多个寝室;
- 宿管老师与宿舍楼是多对多的关系,一个宿管老师可以负责多个宿舍楼,一个宿舍楼也可以由多个宿管老师负责;
- 宿管老师与学生是多对多的关系,一个宿管老师可以负责多个学生的缺寝情况,一个学生也可以由多个宿管老师负责登记缺寝信息;
- 系统管理员可以获取所有的数据信息,拥有最高的权限。
1.3 系统常做的查询与更新
经常做的查询,或许对创建索引有影响的:
- 根据学生的入住状态,姓名,学号,院系,查询学生相关信息
- 根据宿管老师的姓名,电话,查询宿管老师相关信息
- 根据宿舍楼的名称,查询宿舍楼相关信息
- 根据寝室所在楼宇,寝室号,寝室大小,现有人数,查询寝室相关信息
根据经常做的查询,需要创建有关视图的:
- 学生信息 + 寝室信息视图
- 宿舍楼信息 + 寝室信息视图
关于更新
- 当有学生入住某一寝室时,需要使相应的寝室现有人数加一
- 当有学生迁出某一寝室时,需要使相应的寝室现有人数减一
- 当有学生调换寝室时,需要使原本的寝室现有人数减一,新的寝室现有人数加一
- 学生只能入住还有空余位置的寝室
关于删除
- 当删除某一寝室时,其中不能有学生入住
1.4 应用程序功能
前台的主要功能如下:
对于学生:
- 登录以及退出系统。
- 每个学生可以查看自己的缺寝记录。
对于宿管老师:
- 登录以及退出系统。
- 每个宿管老师可以查看自己负责的宿舍楼中学生的基本信息以及缺寝记录。
对于系统管理员:
- 登录以及退出系统。
- 查看宿管老师的基本信息。
- 查看学生的基本信息以及缺寝记录。
- 查看宿舍楼的基本信息。
- 查看寝室的基本信息。
后台的主要功能如下:
对于学生:
- 可以修改自己的密码。
对于宿管老师:
- 可以修改自己的密码。
- 可以对自己负责的宿舍楼中的学生添加缺寝记录。
对于系统管理员:
- 可以修改自己的密码。
- 可以添加,修改,删除宿管老师。
- 可以添加新入住的学生,修改学生的基本信息,删除指定的学生。
- 可以添加新的宿舍楼,修改宿舍楼的基本信息,查看每栋宿舍楼的负责老师,也可添加或移除每栋楼的负责老师。
- 可以添加新的寝室,修改寝室的基本信息,删除指定的寝室。
- 可以安排指定学生的寝室调换。
- 可以迁出已经毕业的学生。
- 可以查看所有指定学生的缺寝记录。
二、数据库概念设计
2.1 确定实体和属性
分析宿舍管理系统的系统需求,将系统中设计的人、物进行抽象,得到了系统的实体如下:
- 系统管理员实体集。属性包括:管理员 ID,用户名,登录密码,真实姓名,性别,电话。
- 宿管老师实体集。属性包括:宿管老师 ID,用户名,登录密码,真实姓名,性别,电话。
- 学生实体集。属性包括:学生 ID 即学号,用户名,登录密码,真实姓名,院系信息,性别,电话。
- 宿舍楼实体集。属性包括:宿舍楼 ID,宿舍楼名称,宿舍楼类型。
- 寝室实体集。属性包括:寝室 ID,寝室名称,寝室大小,寝室现有人数。
2.2 E-R 图
系统 E-R 图如图 2-1 所示:
图 2-1 E-R 图
三、数据库逻辑结构设计
3.1 关系模式设计
根据概念结构设计得到的 E-R 图和转换规则,得到如下关系模式(主键用下划线标出,外键用蓝色标志并予以说明):
- 系统管理员表(管理员 ID,用户名,登录密码,真实姓名,性别,电话)
- 宿管老师表(宿管老师 ID,用户名,登录密码,真实姓名,性别,电话)
- 学生表(学生 ID 即学号,用户名,登录密码,真实姓名,院系信息,性别,电话)
- 宿舍楼表(宿舍楼 ID,宿舍楼名称,宿舍楼类型)
- 寝室表(寝室 ID,寝室名称,寝室大小,寝室现有人数)
- 缺寝记录表(缺寝记录 ID,被登记学生的 ID,登记老师的 ID,登记日期,缺寝原因)
- 宿舍楼-寝室表(宿舍楼-寝室对 ID,宿舍楼 ID,寝室 ID)
- 宿舍楼-教师表(宿舍楼-教师对 ID,宿舍楼 ID,教师 ID)
- 寝室-学生表(寝室-学生对 ID,寝室 ID,学生 ID,学生入住状态,登记日期)
3.2 基本表设计
基本表设计如表 3-1~3-9 所示。
表 3-1:系统管理员表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Admin_ID | int | 否 | 主键 | 管理员 ID | ||
Admin_Username | varchar(30) | 否 | unique | 用户名 | ||
Admin_Password | varchar(30) | 否 | 密码 | |||
Admin_Name | varchar(30) | 否 | 真实姓名 | |||
Admin_Sex | varchar(10) | 是 | “男”或“女” | 性别 | ||
Admin_Tel | varchar(30) | 是 | 电话 |
表 3-2:宿管老师表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Teacher_ID | int | 否 | 主键 | 宿管老师 ID | ||
Teacher _Username | varchar(30) | 否 | unique | 用户名 | ||
Teacher _Password | varchar(30) | 否 | 密码 | |||
Teacher _Name | varchar(30) | 否 | 真实姓名 | |||
Teacher _Sex | varchar(10) | 是 | “男”或“女” | 性别 | ||
Teacher _Tel | varchar(30) | 是 | 电话 |
表 3-3:学生表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Student_ID | int | 否 | 主键 | 学生 ID | ||
Student _Username | varchar(30) | 否 | unique | 用户名 | ||
Student _Password | varchar(30) | 否 | 密码 | |||
Student _Name | varchar(30) | 否 | 真实姓名 | |||
Student _Sex | varchar(10) | 是 | “男”或“女” | 性别 | ||
Student _Tel | varchar(30) | 是 | 电话 | |||
Student_Dept | varchar(30) | 是 | 院系 |
表 3-4:宿舍楼表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Building_ID | int | 否 | 主键 | 宿舍楼 ID | ||
Building _Name | varchar(30) | 否 | 名称 | |||
Building _Type | varchar(30) | 否 | “男生宿舍”或“女生宿舍” | 类型 |
表 3-5:寝室表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Dormitory_ID | int | 否 | 主键 | 寝室 ID | ||
Dormitory _Name | varchar(30) | 否 | 名称 | |||
Dormitory _Size | int | 否 | 大小 | |||
Dormitory_Now | int | 否 | 0 | 现有人数 |
表 3-6:缺寝记录表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
Log_ID | int | 否 | 主键 | ID | ||
Log _StudentID | int | 否 | 外键参考学生表 | 学生 ID | ||
Log _TeacherID | int | 否 | 外键参考宿管老师表 | 老师 ID | ||
Log _Date | varchar(30) | 否 | 登记日期 | |||
Log_Reason | varchar(255) | 否 | 缺寝原因 |
表 3-7:宿舍楼-寝室表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
DB_ID | int | 否 | 主键 | ID | ||
DB_DormitoryID | int | 否 | 外键参考寝室表 | 寝室 ID | ||
DB_BuildingID | int | 否 | 外键参考宿管老师表 | 宿舍楼 ID |
表 3-8:宿舍楼-教师表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
TB_ID | int | 否 | 主键 | ID | ||
TB_TeacherID | int | 否 | 外键参考宿管老师表 | 教师 ID | ||
TB_BuildingID | int | 否 | 外键参考宿舍楼表 | 宿舍楼 ID |
表 3-9:寝室-学生表的设计
属性名 | 数据类型 | 是否可空 | 列约束 | 默认值 | 键 | 解释 |
---|---|---|---|---|---|---|
SD_ID | int | 否 | 主键 | ID | ||
SD_StudentID | int | 否 | 外键参考宿管老师表 | 教师 ID | ||
SD_DormitoryID | int | 否 | 外键参考宿舍楼表 | 宿舍楼 ID | ||
SD_State | varchar(30) | 否 | “入住”或“迁出” | 学生入住状态 | ||
SD_Date | varchar(30) | 否 | 登记日期 |
四、数据库物理设计和实施
4.1 数据库的创建
使用 Navicat for MySQL 建立寝室管理系统的数据库,数据库基本信息如下:
表 4-1:寝室管理系统的数据库参数表
选项 | 参数 |
---|---|
数据库名称 | dormitory |
物理文件名 | dormitory.sql |
4.2 创建基本表
CREATE TABLE `admin` (`Admin_ID` int(11) NOT NULL AUTO_INCREMENT,`Admin_Username` varchar(30) NOT NULL,`Admin_Password` varchar(30) NOT NULL,`Admin_Name` varchar(30) NOT NULL,`Admin_Sex` varchar(10) DEFAULT NULL,`Admin_Tel` varchar(30) DEFAULT '',PRIMARY KEY (`Admin_ID`),UNIQUE KEY `Admin_Username` (`Admin_Username`)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;CREATE TABLE `building` (`Building_ID` int(11) NOT NULL AUTO_INCREMENT,`Building_Name` varchar(30) NOT NULL,`Building_Type` varchar(30) NOT NULL,PRIMARY KEY (`Building_ID`)ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;CREATE TABLE `dormitory` (`Dormitory_ID` int(11) NOT NULL AUTO_INCREMENT,`Dormitory_Name` varchar(30) NOT NULL,`Dormitory_Size` int(11) NOT NULL,`Dormitory_Now` int(10) unsigned zerofill NOT NULL DEFAULT '0000000000',PRIMARY KEY (`Dormitory_ID`)ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4;CREATE TABLE `dor_bui` (`DB_ID` int(11) NOT NULL AUTO_INCREMENT,`DB_DormitoryID` int(11) NOT NULL,`DB_BuildingID` int(11) NOT NULL,PRIMARY KEY (`DB_ID`),KEY `DB_DormitoryID` (`DB_DormitoryID`),KEY `DB_BuildingID` (`DB_BuildingID`),CONSTRAINT `dor_bui_ibfk_1` FOREIGN KEY (`DB_DormitoryID`) REFERENCES `dormitory` (`Dormitory_ID`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `dor_bui_ibfk_2` FOREIGN KEY (`DB_BuildingID`) REFERENCES `building` (`Building_ID`) ON DELETE CASCADE ON UPDATE CASCADEENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;CREATE TABLE `log` (`Log_ID` int(11) NOT NULL AUTO_INCREMENT,`Log_StudentID` int(11) NOT NULL,`Log_Date` varchar(30) NOT NULL,`Log_Reason` varchar(255) NOT NULL,`Log_TeacherID` int(11) DEFAULT NULL,PRIMARY KEY (`Log_ID`),KEY `absence_ibfk_1` (`Log_StudentID`),KEY `Log_TeacherID` (`Log_TeacherID`),CONSTRAINT `log_ibfk_1` FOREIGN KEY (`Log_StudentID`) REFERENCES `student` (`Student_ID`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `log_ibfk_2` FOREIGN KEY (`Log_TeacherID`) REFERENCES `teacher` (`Teacher_ID`)ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4;CREATE TABLE `student` (`Student_ID` int(11) NOT NULL AUTO_INCREMENT,`Student_Username` varchar(30) NOT NULL,`Student_Password` varchar(30) NOT NULL,`Student_Name` varchar(30) NOT NULL,`Student_Dept` varchar(30) DEFAULT NULL,`Student_Tel` varchar(30) DEFAULT NULL,`Student_Sex` varchar(10) DEFAULT NULL,PRIMARY KEY (`Student_ID`),UNIQUE KEY `Student_Username` (`Student_Username`)ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8mb4;CREATE TABLE `stu_dor` (`SD_ID` int(11) NOT NULL AUTO_INCREMENT,`SD_StudentID` int(11) NOT NULL,`SD_DormitoryID` int(11) NOT NULL,`SD_State` varchar(30) NOT NULL,`SD_Date` varchar(30) NOT NULL,PRIMARY KEY (`SD_ID`),KEY `SD_StudentID` (`SD_StudentID`),KEY `SD_DormitoryID` (`SD_DormitoryID`),CONSTRAINT `stu_dor_ibfk_1` FOREIGN KEY (`SD_StudentID`) REFERENCES `student` (`Student_ID`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `stu_dor_ibfk_2` FOREIGN KEY (`SD_DormitoryID`) REFERENCES `dormitory` (`Dormitory_ID`) ON DELETE CASCADE ON UPDATE CASCADEENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4;CREATE TABLE `teacher` (`Teacher_ID` int(11) NOT NULL AUTO_INCREMENT,`Teacher_Username` varchar(30) NOT NULL,`Teacher_Password` varchar(30) NOT NULL,`Teacher_Name` varchar(30) NOT NULL,`Teacher_Sex` varchar(10) DEFAULT NULL,`Teacher_Tel` varchar(30) DEFAULT NULL,PRIMARY KEY (`Teacher_ID`),UNIQUE KEY `Teacher_Username` (`Teacher_Username`)ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;CREATE TABLE `tea_bui` (`TB_ID` int(11) NOT NULL AUTO_INCREMENT,`TB_TeacherID` int(11) NOT NULL,`TB_BuildingID` int(11) NOT NULL,PRIMARY KEY (`TB_ID`),KEY `tea_bui_ibfk_1` (`TB_TeacherID`),KEY `tea_bui_ibfk_2` (`TB_BuildingID`),CONSTRAINT `tea_bui_ibfk_1` FOREIGN KEY (`TB_TeacherID`) REFERENCES `teacher` (`Teacher_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `tea_bui_ibfk_2` FOREIGN KEY (`TB_BuildingID`) REFERENCES `building` (`Building_ID`) ON DELETE CASCADE ON UPDATE CASCADE
ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;
4.3 触发器设计
当有新的学生入住时,对应的寝室现有人数要加一:
CREATE TRIGGER stu_dor_insert_after_trigger after insert
ON stu_dor FOR EACH ROW
BEGIN
update dormitory set Dormitory_Now=Dormitory_Now+1 where Dormitory_ID=new.SD_DormitoryID;
end;
4.4 视图设计
学生信息 + 寝室信息视图:
create view stu_dor_view as
select * from Student, stu_dor, Dormitory
where SD_StudentID=Student_ID and SD_DormitoryID=Dormitory_ID;
宿舍楼信息 + 寝室信息视图:
create view dor_bui_view as
select * from Dormitory,Building,dor_bui where Dormitory_ID=DB_DormitoryID and Building_ID=DB_BuildingID;
五、应用程序设计
5.1 开发及运行环境介绍
- 系统使用的开发工具是 MyEclipse 2017,Navicat for MySQL
- 运行环境是 Tomcat v8.5
- 开发采用 Struts2 + JavaBean + JSP + MySQL 的实现方式
- 测试浏览器为 Chrome 和 MyEclipse 内置浏览器
5.2 主要功能设计
- 登录身份共有三种:系统管理员,宿管老师,学生。输入用户名、密码和身份之后,判断是否和数据库中记录相符。如果用户名和密码正确,那么根据不同身份进入不同子界面。其中用到的权限控制代码段如下:
public String execute() throws Exception {if(Type.equals("系统管理员")){if (null == new AdminDao().CheckLogin(Username, Password)) {Msg = "用户名或者密码错误";return INPUT;}else{
//获取IDString Admin_ID = new AdminDao().CheckLogin(Username, Password);
//创建sessionHttpSession session = ServletActionContext.getRequest().getSession();session.setAttribute("id", Admin_ID);session.setAttribute("type", "1");return SUCCESS;}}else if(Type.equals("宿管老师")){if (null == new TeacherDao().CheckLogin(Username, Password)) {Msg = "用户名或者密码错误";return INPUT;}else{
//获取IDString Teacher_ID=new TeacherDao().CheckLogin(Username, Password);
//创建sessionHttpSession session = ServletActionContext.getRequest().getSession();session.setAttribute("id", Teacher_ID);session.setAttribute("type", "2");return SUCCESS;}}else if(Type.equals("学生")){if (null == new StudentDao().CheckLogin(Username, Password)) {Msg = "用户名或者密码错误";return INPUT;}else{
//获取IDString Student_ID=new StudentDao().CheckLogin(Username, Password);
//创建sessionHttpSession session = ServletActionContext.getRequest().getSession();session.setAttribute("id", Student_ID);session.setAttribute("type", "3");return SUCCESS;}}else{Msg = "身份类型错误";return INPUT;}
}
- 管理员界面提供各种增删改查功能,针对的对象包括学生,宿管老师,宿舍楼,寝室。点击各个功能后会进入对应的子界面。输入需要的参数之后,点击按钮即可完成操作。
<%if(session.getAttribute("type").toString().equals("1")) {%><li><a href="TeacherManager.action">宿管老师管理</a></li><li><a href="StudentManager.action">学生管理</a></li><li><a href="BuildingManager.action">楼宇管理</a></li><li><a href="DormitoryManager.action">宿舍管理</a></li><li><a href="StudentRZ.action">学生入住登记</a></li><li><a href="StudentDH.jsp">学生寝室调换</a></li><li><a href="StudentQC.jsp">学生迁出登记</a></li><li><a href="AdminLog.action">学生缺寝记录</a></li><%
}%>
- 教师界面和管理员类似,不过只提供了对学生缺寝记录的添加和查询操作。
<%if(session.getAttribute("type").toString().equals("2")) {%><li><a href="MyStudent.action">学生管理</a></li><li><a href="MyLog.action">学生缺寝记录</a></li><%
}%>
- 学生界面只提供了查询自己缺寝记录的功能。
<%if(session.getAttribute("type").toString().equals("3")) {%><li><a href="StudentLog.action">我的缺寝记录</a></li><%
}%>
- 下面展示关于教师增删改查的代码,其余类似:
//获取列表
public List<TeacherBean> GetList(String strwhere,String strorder) {String sql="select * from Teacher";if(!(isInvalid(strwhere))){sql+=" where "+strwhere;}if(!(isInvalid(strorder))){sql+=" order by "+strorder;}Statement stat = null;ResultSet rs = null;Connection conn = new DBHelper().getConn();List<TeacherBean> list=new ArrayList<TeacherBean>();try {stat = conn.createStatement();rs = stat.executeQuery(sql);while(rs.next()) {TeacherBean cnbean=new TeacherBean();cnbean.setTeacher_ID(rs.getInt("Teacher_ID"));cnbean.setTeacher_Username(rs.getString("Teacher_Username"));cnbean.setTeacher_Password(rs.getString("Teacher_Password"));cnbean.setTeacher_Name(rs.getString("Teacher_Name"));cnbean.setTeacher_Sex(rs.getString("Teacher_Sex"));cnbean.setTeacher_Tel(rs.getString("Teacher_Tel"));list.add(cnbean);}} catch (SQLException e) {printStackTrace();}finally {try {if (conn != null)conn.close();if (stat != null)stat.close();if (rs != null)rs.close();} catch (SQLException e) {printStackTrace();}}return list;
}
//获取指定ID的实体Bean
public TeacherBean GetBean(int id) {String sql="select * from Teacher where Teacher_ID="+id;Statement stat = null;ResultSet rs = null;Connection conn = new DBHelper().getConn();TeacherBean cnbean=new TeacherBean();try {stat = conn.createStatement();rs = stat.executeQuery(sql);while(rs.next()) {cnbean.setTeacher_ID(rs.getInt("Teacher_ID"));cnbean.setTeacher_Username(rs.getString("Teacher_Username"));cnbean.setTeacher_Password(rs.getString("Teacher_Password"));cnbean.setTeacher_Name(rs.getString("Teacher_Name"));cnbean.setTeacher_Sex(rs.getString("Teacher_Sex"));cnbean.setTeacher_Tel(rs.getString("Teacher_Tel"));}} catch (SQLException e) {printStackTrace();}finally {try {if (conn != null)conn.close();if (stat != null)stat.close();if (rs != null)rs.close();} catch (SQLException e) {printStackTrace();}}return cnbean;
}
//添加
public void Add(TeacherBean cnbean) {String sql="insert into Teacher (";sql+="Teacher_Username,Teacher_Password,Teacher_Name,Teacher_Sex,Teacher_Tel";sql+=") values(";sql+="'"+cnbean.getTeacher_Username()+"','"+cnbean.getTeacher_Password()+"','"+cnbean.getTeacher_Name()+"','"+cnbean.getTeacher_Sex()+"','"+cnbean.getTeacher_Tel()+"'";sql+=")";Statement stat = null;ResultSet rs = null;Connection conn = new DBHelper().getConn();try {stat = conn.createStatement();stat.executeUpdate(sql);} catch (SQLException e) {printStackTrace();}finally {try {if (conn != null)conn.close();if (stat != null)stat.close();if (rs != null)rs.close();} catch (SQLException e) {printStackTrace();}}
}
//修改
public void Update(TeacherBean cnbean) {String sql="update Teacher set ";sql+="Teacher_Username='"+cnbean.getTeacher_Username()+"',";sql+="Teacher_Password='"+cnbean.getTeacher_Password()+"',";sql+="Teacher_Name='"+cnbean.getTeacher_Name()+"',";sql+="Teacher_Sex='"+cnbean.getTeacher_Sex()+"',";sql+="Teacher_Tel='"+cnbean.getTeacher_Tel()+"'";sql+=" where Teacher_ID='"+cnbean.getTeacher_ID()+"'";Statement stat = null;ResultSet rs = null;Connection conn = new DBHelper().getConn();try {stat = conn.createStatement();stat.executeUpdate(sql);} catch (SQLException e) {printStackTrace();}finally {try {if (conn != null)conn.close();if (stat != null)stat.close();if (rs != null)rs.close();} catch (SQLException e) {printStackTrace();}}
}
//删除
public void Delete(String strwhere) {String sql="delete from Teacher where ";sql+=strwhere;Statement stat = null;ResultSet rs = null;Connection conn = new DBHelper().getConn();try {stat = conn.createStatement();stat.executeUpdate(sql);} catch (SQLException e) {printStackTrace();}finally {try {if (conn != null)conn.close();if (stat != null)stat.close();if (rs != null)rs.close();} catch (SQLException e) {printStackTrace();}}
}
5.3 主要界面
登录界面如图 5-1 所示。用户名或密码为空时点击登录会有提醒。登陆失败时也会有提醒如图 5-2 所示。
图 5-1 登陆界面
图 5-2 登陆失败界面
以管理员身份登录后的主界面如图 5-3 所示,左侧为导航栏:
图 5-3 管理员主界面
管理员可以查看宿管老师列表,如图 5-4 所示,有分页和模糊查询功能:
图 5-4 宿管老师列表界面
管理员可以添加宿管老师,如图 5-5 所示:
图 5-5 添加宿管老师界面
管理员可以修改宿管老师的基本信息,如图 5-6 所示:
图 5-6 修改宿管老师界面
删除宿管老师时,会弹出确认框,如图 5-7 所示:
图 5-7 删除宿管老师界面
管理员可以查看学生列表,如图 5-8 所示,有分页和模糊查询功能:
图 5-8 学生列表界面
管理员可以添加入住学生,如图 5-9 所示:
图 5-9 学生入住登记界面
管理员可以修改学生的基本信息,如图 5-10 所示:
图 5-10 修改学生界面
删除学生时,会弹出确认框,如图 5-11 所示:
图 5-11 删除学生界面
管理员可以查看宿舍楼列表,如图 5-12 所示,有分页和模糊查询功能:
图 5-12 宿舍楼列表界面
管理员可以添加宿舍楼,如图 5-13 所示:
图 5-13 添加宿舍楼界面
管理员可以查看负责某一宿舍楼的宿管老师,并能进行添加和删除操作,如图 5-14 所示:
图 5-14 宿舍楼负责老师列表界面
管理员可以修改宿舍楼的基本信息,如图 5-15 所示:
图 5-15 修改宿舍楼界面
管理员可以查看宿舍列表,如图 5-16 所示,有分页和模糊查询功能:
图 5-16 宿舍列表界面
管理员可以添加宿舍,如图 5-17 所示:
图 5-17 添加宿舍界面
管理员可以修改宿舍的基本信息,如图 5-18 所示:
图 5-18 修改宿舍界面
删除宿舍时,会弹出确认框,如图 5-19 所示:
图 5-19 删除宿舍界面
管理员可以调换学生的宿舍,如图 5-20,5-21 所示:
图 5-20 调换学生宿舍界面 1
图 5-21 调换学生宿舍界面 2
管理员可以迁出学生,如图 5-22,5-23 所示:
图 5-22 迁出学生界面 1
图 5-23 迁出学生界面 2
管理员可以查看学生的缺寝记录,如图 5-24,5-25 所示:
图 5-24 查看学生的缺寝记录界面 1
图 5-25 查看学生的缺寝记录界面 2
管理员可以修改自己的密码,如图 5-26 所示,宿管老师和学生也有同样的功能,后面不再赘述:
图 5-26 修改密码界面
管理员可以退出系统,如图 5-27 所示,宿管老师和学生也有同样的功能,后面不再赘述:
图 5-27 退出系统界面
以宿管老师身份登录后,可以进行学生管理,如图 5-28,5-29 所示,有分页和模糊查询功能:
图 5-28 学生管理界面 1
图 5-29 学生管理界面 2
宿管老师可以针对某一学生进行缺寝登记:
图 5-30 学生缺寝登记界面
宿管老师可以查看自己负责的学生的缺寝记录,如图 5-31,5-32 所示,有分页和模糊查询功能:
图 5-31 学生缺寝记录界面 1
图 5-32 学生缺寝记录界面 2
以学生身份登录后,可以查看自己的缺寝记录,有分页功能,如图 5-33 所示:
图 5-33 学生查看自己缺寝记录界面
六、心得体会
在设计数据库的过程中有遇到过问题。
首先,在设计阶段有非常多的数据项,当时觉得不好分类和处理,而且有很多的数据项和许多实体都有关系。最后通过将各个数据项进行归类,对于和多个实体之间都有关系的数据项可以建立一个关系表,从而完成归类。
接着,在添加数据的过程中,我忽略掉了数据的参照完整性,导致许多数据之间没有了关联性。后来我将数据进行了统一分析,保持所有的数据一致,解决了这个问题。但由于有了数据的参照完整性,又引来了新的问题,诸如:在删除宿舍楼时,应先要删除宿舍楼中的所有宿舍;在删除宿舍时,应先要迁出或删除宿舍中的所有学生,发现一开始在编写代码时没有考虑到这些问题,便在代码中加紧完善了相关的逻辑。
最后,每个表中的数据更改完成之后,更改后的数据会丢失找不到了。对于这个问题就解决办法为加入触发器,记录表中信息的修改前的值,成功解决问题。
经过这次实践,我得出了一个非常重要的结论:对于一个系统,数据库的设计是非常重要的,数据库设计决定了以后数据好不好维护。后期需求好不好展。同时也决定了系统的性能。一个坏的数据库设计一个功能点的改动可能会设计多张表的改动。一不小心可能就会引起数据的不一致。为了解决这些问题。在数据库设计之初就要考虑这些问题,以减少后期系统维护量。