数据库实验三报告
嵌入式SQL与数据库编程
数据库连接技术简介
数据库连接技术概念
数据库连接技术是指建立并管理与数据库系统之间的连接的技术。它可以让应用程序与数据库系统之间共享数据,并提供高效、安全的数据访问方法。
常见的数据库连接技术
- JDBC(Java Database Connectivity):
它是Java平台中一个标准的API,可以访问各种关系型数据库系统,如MySQL、Oracle等。JDBC提供了一个统一的接口,可以让开发人员使用相同的API连接各种数据库系统。(本次实验采用该种技术) - ODBC(Open Database Connectivity):
它是一个开放的标准,可以让数据库系统与应用程序进行连接。ODBC提供了一种通用的接口,允许开发人员使用一套API代码来访问不同类型的数据库系统。 - ORM(Object-relational mapping):
它是一种将对象模型和关系型数据库之间的数据映射的技术。ORM可以将数据库中的表映射为对象,并提供一种易于使用和理解的API来进行数据的操作和处理。 - JDBC Pool:JDBC Pool:
基于数据库连接池的技术,通过在应用程序和数据库之间设置一层池集中管理数据库连接。连接池可以在应用程序和数据库之间缓存连接,当应用程序需要连接时,它可以从连接池中获取一个连接,并将它返回给池,从而提高连接的效率和性能。 - ORM:ORM(Object-Relational Mapping):
一种将对象模型与关系型数据模型进行映射的技术。ORM通常使用面向对象的思想来访问数据库,将数据库中的数据转换为面向对象的结构,从而实现使用面向对象的方式对数据库进行访问。 - NoSQL:NoSQL(not only SQL):
一种非关系型数据库的技术。NoSQL数据库不使用传统的SQL语言,而是使用其他查询语言或API来操作数据。 - RPC:RPC(Remote Procedure Call):
一种远程过程调用协议,用于实现在不同机器上的程序间进行通信和数据交互。RPC可以用于连接不同的数据库,实现分布式数据交互。
数据库连接环境配置
- 数据库配置 :
openGauss数据库:已建库 test_20201230 ;库内建8张表以及三个游客视图,如下:
- 数据库服务器 :openEuler
- web服务器及部署 :tomcat + eclipse + Windows10
- 编程语言:java + JS + css + html5
- 数据库连接技术:JDBC
嵌入式SQL的实现过程
测试连接
简单编写一个Java程序使用JDBC连接到openGauss数据库,测试连通性。
如图,连接成功。
编写web项目
以珠海政府网站为例,简单做修改完成本次实验任务。
修改部分为:
- 点击政务公开部分,会为游客用户显示实验二为游客设计的三张视图。
由JSP结合servlet技术实现数据库查询并将查询结果做传输并整合输出。具体实现代码如图:
- 增加内部管理人员登录界面,登录后可对数据库做简单操作。
- 登陆成功提示以及用户标识
具体实现代码如图:
- 再次进入政务公开页面,可以看到管理选项
任意点击修改内容
修改成功!
具体实现代码如图:
- 删除内容测试
由于删除的表中元组存在依赖完整性,且在建表时未使用 ON DELETE CASCADE 选项,故无法直接使用 delete 语句删除。此时思考有两种方案:
- 方案一:可以设计每个表的删除触发器;
- 方案二:修改每个表的属性,添加 ON DELETE CASCADE 选项;
由于表数目较多,故决定采用方案二。
修改员工表如下:
其他表修改类似。
修改成功后,就可以测试删除功能了:
删除成功!点击返回确认已删除。
实现代码截图:
- 添加数据库信息测试
录入新的数据有很多种情况:新增部门、新增职务、新增员工等,由于时间关系,在本次实验中仅实现增加员工功能。
在主页面增加录入新员工数据选项
点击进入后产生录入界面
接着使用数据库存储过程完成录入后端设计。
首先设计存储过程1:CREATE PROCEDURE new_user_insert1( IN eno character(8), IN dno character(2), IN ename character(20), IN epasswd character(12), IN esex character(3), IN ebirth timestamp(0) without time zone, IN pname character(20), IN pno character(4) ) AS BEGIN INSERT INTO empolyeer VALUES(eno, dno, ename, epasswd, esex, ebirth); INSERT INTO danren VALUES (eno,pno,ebirth); END;
该功能为将有职务的员工信息在两个表内插入。类似的有职级部分插入的存储过程:CREATE PROCEDURE new_user_insert2( IN eno character(8), IN dno character(2), IN ename character(20), IN epasswd character(12), IN esex character(3), IN ebirth timestamp(0) without time zone, IN rname character(20), IN rno character(4) ) AS BEGIN INSERT INTO empolyeer VALUES(eno, dno, ename, epasswd, esex, ebirth); INSERT INTO pinyong VALUES(eno, rno, ebirth); END;
由于 danren 以及 pinyong 两张表在实验二中已设计触发器,可以自动修改为当前系统时间,故时间值任意插入。
简单测试一下是否可用:
可以使用。
接着完成后端代码接入设计。
测试插入功能:
插入成功,点击返回查看,已完成插入。
实现代码截图:
问题分析
- 问题1:java项目中的数据库连接成功,但web项目始终无法连接成功。
检查了用户密码正确以及web工程中jar包的复制及路径构建都没问题。
最后通过查找资料发现是未将jar包复制到tomcat中,尝试了一下,连接成功。很奇怪!jar包明明已经在工程中了,为什么还需要为tomcat单独提供资源包。继续查找资料发现:正常情况下,在Web应用程序中包含了数据库驱动程序的依赖库,并且已经将这些依赖库添加到了项目的build path中,这样在重新构建Web应用程序后,就会将这些依赖库一并打包到WEB-INF/lib目录下。但是在将Web应用程序部署到Tomcat服务器之前,还需要将这些依赖库的JAR文件复制到Tomcat服务器的lib目录下,以便在Tomcat服务器启动时,能够正确地加载这些依赖库。这是因为Tomcat服务器在启动的时候,会先加载自己的Classpath,然后再加载Web应用程序的Classpath。如果Web应用程序中使用的依赖库未在Tomcat服务器的Classpath中找到,那么将无法正确地加载这些依赖库。 - 问题2:在进行登录设计实现时,明明账户密码都是对的但登不了
一直以为是代码有问题,不断调试才发现是openGauss在存储时char(8)时将未占满的位置全部以空格填充,因此尝试补满空格
就很离谱。。。看来openGauss做登录的口令存储方案还是要好好琢磨琢磨的。
实验感想
此次试验花费了不少时间,尤其在最后这段时间有不少考试,做不完一直很焦虑。想做好,遇到各种bug,更焦虑···还好,坚持下来了。实验主要是应用的设计以及数据库存储过程部分花了不少时间,应用的方式呈现是主要的纠结点。很明显完成这样一个功能完善、健壮的应用差的还很远,还需要花费不少的时间。更别说针对应用的安全设计实现,简直工作量想想就能吓退不少人了。整体来说,收获很丰富。让我对数据库的理解以经不仅仅是一门课而更加倾向于一个工具。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步