数据库技术 课件 项目11 综合应用_第1页
数据库技术 课件 项目11 综合应用_第2页
数据库技术 课件 项目11 综合应用_第3页
数据库技术 课件 项目11 综合应用_第4页
数据库技术 课件 项目11 综合应用_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库技术11.1需求分析11.1需求分析

本学生信息管理系统旨在实现对学生基本信息等进行管理。通过采用JavaWeb技术和MySQL数据库,结合现代Web开发技术和数据库管理技术,构建一个高效、安全、可扩展的学生信息管理系统。该系统的设计将满足学校和教育机构对学生信息管理的需求,提高管理效率,降低管理成本。11.1需求分析

通过多次与相关人员沟通后,进一步明确了系统要实现的主要功能。文字描述如下所示。学生用户:①查看个人信息。②根据课程编号或学号查询成绩。③查询课程信息和任课老师信息。教师用户:①查看个人信息。②查询学生信息。③根据课程编号录入学生成绩。④查询学生成绩的最高分、平均分等统计信息。管理员用户:①对用户(包括学生、教师和管理员)进行增删改查操作。②对院系、课程、成绩等信息进行增删改查操作。③维护系统安全,包括备份和恢复数据库、设置用户权限等。随后可完成用例图的绘制。图为用例图中的一部分。谢谢数据库技术11.2逻辑设计11.2逻辑设计根据功能需求,可进一步定义实体和它们之间的关系。如学生、课程、成绩、教师、用户、角色等。若干实体在前面的学习内容中已有介绍,此处仅对用户及角色两个实体进行举例说明。11.2逻辑设计角色(Roles):角色id(主键)、名称、描述等。用户(Users):属性:用户编号(主键)、用户名、密码、角色id(学生、教师、管理员)等。对应的关系模式可写为:角色(角色id,名称,描述)用户(用户id,用户名,密码,角色id)相关E-R图如图11.2所示。对应的类图如图11.3所示。图11.2

用户实体与角色实体的E-R图图11.3Users类与Roles类及其关系谢谢数据库技术11.3物理设计11.3物理设计若干实体在前面的学习内容中已有介绍,此处仅对用户及角色两个实体进行举例说明。具体信息参看表11.1与表11.2。表11.1roles数据表设计表11.2users数据表设计谢谢数据库技术11.4创建数据库11.4创建数据库001dropdatabaseifexistssims;002createdatabasesims;003usesims;004005-------------------------------006--tablestructureforroles007-------------------------------008--roles(role_id,role_name,roleDescription)009droptableifexistsroles;010createtableroles(011roleIdintnotnullauto_increment,012roleNamevarchar(16),013roleDescriptionvarchar(256),014primarykey(roleId)015);016017insertintorolesvalue(1,"admin","admin");018insertintorolesvalue(2,"manager","manager");019insertintorolesvalue(3,"staff","staff");020insertintorolesvalue(4,"teacher","teacher");021insertintorolesvalue(5,"student","student");022根据物理设计,在mysql中创建数据库sims。主要代码如下。023-------------------------------024--tablestructureforusers025-------------------------------026--users(usr_id,usr_name,userPassword,role_id)027droptableifexistsusers;028createtableusers(029userIdintnotnullauto_increment,030userNamevarchar(16),031userPasswordvarchar(16),032roleIdint,033primarykey(userId),034constraintfk_role_idforeignkey(roleId)referencesroles(roleId)ondeletecascadeonupdatecascade035);036037insertintousersvalueS(1,"admin","123456",1);038insertintousersvalueS(2,"manager01","123456",2);039insertintousersvalueS(3,"staff01","123456",3);040insertintousersvalueS(4,"teacher","123456",4);041insertintousersvalueS(5,"student","123456",5);11.4创建数据库要点说明:代码中的第1-3行是创建数据库sims,第9-15行是创建数据表roles,第17-21行是添加测试角色数据。第27-35行是创建数据表users,并在第34行中创建了表间关系并设置了级联更新与删除;第37-41是添加用于测试的用户数据。谢谢11.5项目的创建、配置、运行与发布汇报人:WPS数据库技术单击此处添加副标题创建项目11.5.111.5.1创建项目1.按图11.4创建JavaWeb项目创建一个由maven进行项目管理的web应用项目,名称为sims,位置存放在workspace目录下。图11.4创建JavaWeb项目11.5.1创建项目2.参照图11.5对版本与依赖进行设置(此处使用默认值即可)。图11.5项目依赖设置11.5.1创建项目3.项目初始环境如图11.6所示。图11.6项目初始环境11.5.1创建项目4.参考图11.7对项目仓库进行相应设置。图11.7设置项目仓库图11.5

项目依赖设置项目运行环境配置11.5.211.5.2项目运行环境配置1.修改项目启动路径applicationcontext,如图11.8所示图11.8项目启动路径设置11.5.2项目运行环境配置2.切换到server选项卡,如图11.9所示。图11.9server配置11.5.2项目运行环境配置3.点击【Configure...】可对tomcat进行设置。图11.10可作参考。图11.10tomcat的设置项目的运行11.5.311.5.3项目的运行启动项目,结果如图11.11所示。图11.11项目运行结果

项目的发布11.5.411.5.4项目的发布项目部署时可参考图11.12将war文件或snapshot目录拷贝到服务器的相应路径即可。图11.13展示的是将发布后的项目部署到tomcat中的位置。图11.12发布后的项目文件图11.13项目文件部署到tomcat中的位置谢谢11.6项目的整体结构数据库技术11.6项目的整体结构结合实际需求,本项目由以下三部分构成:数据库部分:库名为sims,表有角色表Roles、用户表Users等。前端页面部分:包含首页、登录、角色管理与用户管理等页面。后端代码部分:后端采用MVC设计思想将项目进行分层设计,包含控制层controller、服务层service、数据访问层dao、数据实体entity等。后端代码主要结构如图11.14所示。视图部分由前端页面去实现。其主要结构如图11.15所示。图11.4创建JavaWeb项目图11.15前端页面文件结构谢谢数据库技术11.7项目的实现

项目依赖包11.7.111.7.1项目依赖包001<?xmlversion="1.0"encoding="UTF-8"?>002<projectxmlns="/POM/4.0.0"003xmlns:xsi="/2001/XMLSchema-instance"004xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd">005<modelVersion>4.0.0</modelVersion>006007<groupId>com.example</groupId>008<artifactId>sims</artifactId>009<version>1.0-SNAPSHOT</version>010<name>sims</name>011<packaging>war</packaging>012013<properties>014<piler.target>1.8</piler.target>015<piler.source>1.8</piler.source>016<junit.version>5.7.1</junit.version>017</properties>0181.项目依赖包的信息管理pom.xml是项目管理中的重要文件,有关项目依赖包可在该文件添加对应的信息。为方便学习,此处给出文件内容并做简要说明。019<dependencies>020<dependency>021<groupId>javax.servlet</groupId>022<artifactId>javax.servlet-api</artifactId>023<version>4.0.1</version>024<scope>provided</scope>025</dependency>026<dependency>027<groupId>org.junit.jupiter</groupId>028<artifactId>junit-jupiter-api</artifactId>029<version>${junit.version}</version>030<scope>test</scope>031</dependency>032<dependency>033<groupId>org.junit.jupiter</groupId>034<artifactId>junit-jupiter-engine</artifactId>035<version>${junit.version}</version>036<scope>test</scope>11.7.1项目依赖包037</dependency>038<dependency>039<groupId>mysql</groupId>040<artifactId>mysql-connector-java</artifactId>041<version>8.0.28</version>042</dependency>043<dependency>044<groupId>com.fasterxml.jackson.core</groupId>045<artifactId>jackson-databind</artifactId>046<version>2.13.5</version>047</dependency>048<dependency>049<groupId>javax.servlet</groupId>050<artifactId>jstl</artifactId>051<version>1.2</version>052</dependency>053<dependency>054<groupId>com.mchange</groupId>055<artifactId>c3p0</artifactId>056<version></version>057</dependency>058<dependency>059<groupId>com.google.code.gson</groupId>060<artifactId>gson</artifactId>061<version>2.8.5</version>062</dependency>063</dependencies>064065<build>066<plugins>067<plugin>068<groupId>org.apache.maven.plugins</groupId>069<artifactId>maven-war-plugin</artifactId>070<version>3.3.1</version>071</plugin>072</plugins>073</build>074</project>11.7.1项目依赖包要点说明:代码中的第1行声明了文件的类型(xml)与字符编码(utf-8);第2-4行对项目命名空间、架构实例、架构信息进行了定义(此部分无需用户干预,直接引用即可),第5行为项目模型版本。第7-11行对项目公司名、项目标识、版本、名称及打包后的生成类型进行了定义。第13-17行定义了三个项目成员变量及对应的值。第19-63行对项目依赖包进行了定义。第20-25定义了Servlet的组织名、id、版本,作用范围(provided表示必须随项目一起发布,test表仅用于测试)。第26-37行是测试依赖包的信息;第38-42行是mysql数据库的驱动信息;第43-47行用于处理josn数据转换,第48-52行用于提供对jsp页面中的taglib支持,第53-57行的c3p0则为项目提供数据连接池支持。第58-62用于json数据解析。第65-73行定义了项目创建时所需的插件。11.7.1项目依赖包2.更新项目信息参考图11.16,在maven中更新项目依赖信息。更新后的结果如图11.17所示。表11.1roles数据表设计表11.2users数据表设计创建数据连接公用类11.7.211.7.2创建数据连接公用类001packagecom.example.sims.dbutils;002003importjava.beans.PropertyVetoException;004importjava.sql.Connection;005importjava.sql.DriverManager;006importjava.sql.SQLException;007importcom.mchange.v2.c3p0.ComboPooledDataSource;008009importjavax.sql.DataSource;010011publicclassDbUtils{012privatestaticfinalStringDRIVER="com.mysql.cj.jdbc.Driver";013privatestaticfinalStringURL="jdbc:mysql://localhost:3306/sims?autoReconnect=true";014privatestaticfinalStringUSER="root";015privatestaticfinalStringPASSWORD="root";016为方便实现数据库连接,这里创建一个dbutils/DbUtils.java类,负责提供数据连接。其代码如下。017privatestaticConnectionconnection=null;018019static{020try{021Class.forName(DRIVER);022connection=DriverManager.getConnection(URL,USER,PASSWORD);023}catch(ClassNotFoundException|SQLExceptione){024e.printStackTrace();025}026}027028publicstaticConnectiongetConnection(){029returnconnection;030}03111.7.2创建数据连接公用类032publicstaticvoidcloseConnection(){033if(connection!=null){034try{035connection.close();036}catch(SQLExceptione){037e.printStackTrace();038}039}040}041042privatestaticDataSourcedataSource;043044static{045ComboPooledDataSourcecpds=newComboPooledDataSource();046try{047cpds.setDriverClass(DRIVER);048}catch(PropertyVetoExceptione){049e.printStackTrace();050}051cpds.setJdbcUrl(URL);052cpds.setUser(USER);053cpds.setPassword(PASSWORD);054cpds.setInitialPoolSize(5);055cpds.setMinPoolSize(5);056cpds.setMaxPoolSize(20);057dataSource=cpds;058}059060publicstaticDataSourcegetDataSource(){061returndataSource;062}063}11.7.2创建数据连接公用类要点说明:第12-15行分别定义的连接数据库的关键信息:数据库驱动程序、目标数据库地址、连接名称与密码。第17-30行实现的是获取一个连接对象。第21行是注册驱动,第22行则由驱动管理程序创建连接对象。第32-40行是一个简单的关闭连接的方法。第42-62实现的是一个数据访问池对象的获取,返回的是一个数据源对象。

数据实体的创建11.7.311.7.3数据实体的创建结合数据表的结构以及后端设计需求,分别在entity包下创建Role.java、User.java等实体类。1.Role.javaRole.java中的主要内容如下。003publicclassRole{004privateintroleId;005privateStringroleName;006privateStringroleDescription;007008//GettersandSetters032}简要说明:结合数据表结构重点写出第4-7行,其它部分可由集成环境自动生成(getter|setter)。2.User.java等可参考上述代码进行编写,具体内容请参看项目源码。数据访问层dao的设计11.7.411.7.4数据访问层dao的设计013publicclassRoleDao{014finalConnectionconnection=DbUtils.getConnection();015016//创建角色017publicvoidinsertRole(Rolerole)throwsSQLException{018Stringsql="INSERTINTOroles(roleName,roleDescription)VALUES(?,?)";019try(PreparedStatementstmt=connection.prepareStatement(sql)){020stmt.setString(1,role.getRoleName());021stmt.setString(2,role.getRoleDescription());022stmt.executeUpdate();023}024}025026//删除角色027publicvoiddeleteRole(introleId)throwsSQLException{028Stringsql="DELETEFROMrolesWHEREroleId=?";029try(PreparedStatementstmt=connection.prepareStatement(sql)){这是数据库学习与应用的重点部分,若干与数据库的相关操作均在进行处理。本项目中以Roles表与Users表的操作为例进行代码编写,其它数据表的操作代码与此类似。在dao包下创建RoleDao.java类。这里只涉及到单表操作,代码相对简单。主要内容如下。030stmt.setInt(1,roleId);031stmt.executeUpdate();032}033}034035//更新角色036publicvoidupdateRole(Rolerole)throwsSQLException{037Stringsql="UPDATErolesSETroleName=?,roleDescription=?WHEREroleId=?";038try(PreparedStatementstmt=connection.prepareStatement(sql)){039stmt.setString(1,role.getRoleName());040stmt.setString(2,role.getRoleDescription());041stmt.setInt(3,role.getRoleId());042stmt.executeUpdate();043}044}045046//根据id获取角色数据047publicRoleselectRoleById(introleId)throwsException{048Stringsql="SELECT*FROMrolesWHEREroleId=?";11.7.4数据访问层dao的设计049PreparedStatementps=connection.prepareStatement(sql);050ps.setInt(1,roleId);051ResultSetrs=ps.executeQuery();052053if(rs.next()){054Rolerole=newRole();055role.setRoleId(rs.getInt("roleId"));056role.setRoleName(rs.getString("roleName"));057role.setRoleDescription(rs.getString("roleDescription"));058returnrole;059}060061rs.close();062ps.close();063connection.close();064returnnull;065}066067//获取所有角色数据068publicList<Role>selectAllRoles()throwsSQLException{069List<Role>roles=newArrayList<>();070Stringsql="SELECT*FROMroles";071try(PreparedStatementstatement=connection.prepareStatement(sql);072ResultSetresultSet=statement.executeQuery()){073while(resultSet.next()){074Rolerole=newRole();075role.setRoleId(resultSet.getInt("roleId"));076role.setRoleName(resultSet.getString("roleName"));077role.setRoleDescription(resultSet.getString("roleDescription"));078roles.add(role);079}080}081returnroles;082}083}11.7.4数据访问层dao的设计要点说明:前期学习的数据表操作主要体现在代码中的第18行(insert)、第28行(delete)、第37行(update)、第48行(select)、第70行(select)。为避免注入攻击等数据安全问题,这里采用了连接对象中的预处理语句方法(prepareStatement)来实现参数的传递与处理,另一方面,这里也使用了预处理语句对象的executeUpdate方法来实现增、删、改的操作;在需要返回数据行(select查询)时,则调用executeQuery方法来实现。UserDao.java等可参考上述代码进行编写,具体内容请参看项目源码。

服务层service的设计11.7.511.7.5服务层service的设计009publicclassRoleService{010privateRoleDaoroleDao=newRoleDao();011012publicvoidinsertRole(Rolerole)throwsSQLException{013roleDao.insertRole(role);014}015016publicvoiddeleteRole(introleId)throwsSQLException{017roleDao.deleteRole(roleId);018}019这一部分主要解决对dao层各种业务的调用与处理。作为演示,这里在service包下创建了RoleService.java与UserService.java两个类来进行说明。代码并不复杂,主要内容如下。020publicvoidupdateRole(Rolerole)throwsSQLException{021roleDao.updateRole(role);022}023024publicRoleselectRoleById(introleId)throwsException{025returnroleDao.selectRoleById(roleId);026}027028publicList<Role>selectAllRoles()throwsSQLException{029returnroleDao.selectAllRoles();030}031}11.7.5服务层service的设计要点说明:代码中的第10行创建了dao层的RoleDao实例,从而可以调用其中的方法对Roles表进行数据操作。UserService.java等可参考上述代码进行编写,具体内容请参看项目源码。控制层controller的设计11.7.611.7.6控制层controller的设计019@WebServlet("/login")020publicclassLoginControllerextendsHttpServlet{021privateUserServiceuserService=newUserService();022privateRoleServiceroleService=newRoleService();023024protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{025026Stringusername=request.getParameter("username");027Stringpassword=request.getParameter("password");028

这一层是前端与后端连接的主要部分。前端发来的各种请求,在这一层收到后,会根据具体任务去调用service中的相关服务,然后将结果返回到前端页面。

这里需要强调的是,在进行同步开发时,项目开发说明中需要对相关接口进行约定。如数据传送的名称、格式等。本项目均采用json格式来进行处理,相关依赖包已在创建时项目时已导入。下面先实现一个登录功能。

这一部分主要处理前端(login.html)传递过来的登录信息,在处理完成后将结果返回给调用页面。在controller包中创建LoginController.java类,主要内容如下。029try{030Useruser=userService.selectUserByNameAndPassword(username,password);031if(user!=null){032Rolerole=roleService.selectRoleById(user.getRoleId());033StringredirectUrl="";034switch(role.getRoleName()){035case"admin":036redirectUrl="admin/admin_home.html";037break;038case"manager":11.7.6控制层controller的设计039redirectUrl="admin/userManagement.html";040break;041case"teacher":042redirectUrl="teacher/teacher_home.html";043break;044case"student":045redirectUrl="student/student_home.html";046break;047}048049Map<String,Object>result=newHashMap<>();050result.put("success",true);051result.put("redirectUrl",redirectUrl);052result.put("username",user.getUserName());053response.setContentType("application/json");054response.getWriter().write(newGson().toJson(result));055}else{056Map<String,Object>result=newHashMap<>();057result.put("success",false);058result.put("message","用户名或密码错误");059response.setContentType("application/json");060response.getWriter().write(newGson().toJson(result));061}062}catch(Exceptione){063e.printStackTrace();064response.setContentType("application/json");065PrintWriterout=response.getWriter();066out.print("{\"success\":false}");067out.flush();068}069}070}11.7.6控制层controller的设计要点说明:第19

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论