Java Web实战 | JDBC案例:实现图书管理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在项目开发中,应用程序需要的数据基本都是存放在数据库中的。对数据的管理过程离不开数据库。本文将运用JDBC API编写一个实现基本数据库操作(添加、修改、删除、查询)的应用程序,实现对图书信息的管理。完成此项目的具体步骤如下。

640.jpg


(1) 事件:对于Web应用程序而言,ServletContext对象、HttpSession对象和ServletRequest对象的状态改变可称为Servlet事件。如HttpSession对象的创建,ServletRequest对象中属性的增加或移除都是事件。

(2) 监听器:负责监听事件是否发生。它是一个实现了一个或多个Servlet事件监听接口的类。它在Web应用程序部署时被注册到Web容器中并被实例化。

(3) 事件处理器: 监听器的方法。当事件发生的时候,监听器会监听到事件的发生,并触发相应的处理器用以处理事件。

01、准备工作

在MySQL中创建一个名为jdbc的数据库,在该数据库中创建一个名为book的表。创建jdbc数据库和book表的语句如下:

create database jdbc;
use jdbc;
CREATE TABLEbook’(
id’int(11) NOT NULL AUTO INCREMENT,
bookname'varchar(100) DEFAULT NULL,
author'char(1) DEFAULT NULL,
publisher’varchar(100) DEFAULT NULL,
varchar(4) DEFAULT NULLvear,
priceFLOAT DEFAULT NULL,
remarkvarchar(100) DEFAULT NULL,
PRIMARY KEY (id')
)ENGINE = InnODB AUTO INCREMENT = 1 DEFAULT CHARSET = utf8mb3

创建一个名为jdbc的Maven项目,将项目需要的MySQL驱动包mysql-connector-java-8.0.28.jar和单元测试工具JUnit包junit.4.10.jar的依赖信息添加到pom.xml文件,代码如下:

< dependency >
<groupId> junit </groupId>
<artifactId> junit </artifactId>
< version > 4.10 </version >
< scope > test </scope >
</dependency>< dependency>
<groupId>mysql </groupId>
<artifactId> mysql - connector - java </artifactId><version>8.0.28 </version></dependency>

02、创建JavaBean

在src/main/java文件夹下创建名为com.example.jdbc.entity的包。并在该包上创建名为Book的书籍信息实体类。Book类的代码如文件1所示。
【文件1】Book.java

package com.example.jdbc.entity;
public class Book {
private Integer id;private String bookname;private String publisher;
private float price;
private String remark;
//此处省略了 Getters/Setters 方法
//为便于查看输出,重写了 toString()方法,此处略

03、创建工具类

由于每次操作数据库前都要加载数据库驱动,建立数据库连接;数据库操作结束后都要释放数据库和JDBC资源。为了避免代码重复,可将上述功能的代码抽取出来建立一个工具类,供其他组件调用。因此,创建一个名为com.example.jdbc.utils的包,在包中创建一个名为DBUtils的类,用于实现上述功能,其代码如文件2所示。
【文件2】DBUtils.java

package com.example.jdbc.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sgl.PreparedStatement;
import java.sql.ResultSet;
import java.sgl.SQLException;
public class DBUtils {
  private DBUtils(){
    }
  public static Connection getConnection()Connection conn = null:
    try ( 
    //加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//创建连接字
String url ="jdbc:mysql://localhost:3306/jdbc"
Strinq username"root"
"1234"String password =
//建立数据库连接
conn = DriverManager.getConnection(url,username,password); catch(ClassNotFoundException cnf) {
cnf.printStackTrace();
 catch(SOLException se) (
se.printStackTrace();
return conn;
}

public static void destrov( Connection conn,
PreparedStatement pstmt,ResultSet rs) (
try i
if(rs != null)
rs.close();
if(pstmt != null)
pstmt.close();
if(conn != null)
conn.close();
catch(SQLException se){
se.printStackTrace();
}
}
}

如文件2所示,在第10~11行将DBUtils类的构造方法设置为private(私有),这样就指定了DBUtil的工作形式为单例模式。第13~30行定义了一个静态方法getConnection()用于加载数据库驱动,建立数据库连接。第32~44行定义了一个静态方法destroy(),用于释放相关的JDBC资源。为了实现对数据库的操作,首先要建立数据库连接,即创建Connection对象(conn)。然后通过Connection对象创建数据库操作对象,如PreparedStatement对象(pstmt)。对于查询操作,又通过pstmt创建ResultSet对象(rs)。当完成对数据库的操作后,应及时关闭这些对象以释放JDBC资源。关闭这些对象的顺序与创建的顺序正好相反,如文件2中第35~40行所示。

04、创建DAO接口和实现类

在src/main/java文件夹下创建一个名为com.example.jdbc.dao的包。在包中创建一个名为BookDao的接口和该接口的实现类BookDaoImpl。接口可以用来规定要执行哪些数据库操作,而实现类BookDaoImpl用于实现接口规定的数据库的操作。其中,BookDao接口和实现类代码如文件3和文件4所示。
【文件3】BookDao.java

package com.example.jdbc.dao ;
import java.util.List;
import com.example.jdbc.entity.Book;
public interface BookDao{
public List < Book > listAll();
public boolean addBook(Book book):
public boolean deleteBook(Integer id);
public boolean updateBook( Book book):
public Book findBookById(Integer id);
}

【文件4】BookDaoImpl.java

d73cb2d288b5f33140457e73136cc34c.png


b517504967e1857b1554fa8321e3c886.png


c6bab8561841bc307822520afbad5add.png


c1944cc0e529a8cc22d0fa80dc34bab5.png


dcfb8cff1a31392cf17f089a4cf13ef5.png


e73006f7d38ed4ec1e4a3ae9946568a6.png

在应用JDBC技术进行数据库应用开发时,需要注意以下两点。

(1) 要保证数据独立性。数据独立性是指应用程序和数据之间相互独立,互不影响。它是数据库系统的最重要目标之一。如文件4中的第24~32行,通过select语句获取的ResultSet对象中存放了查询结果,但此时数据库处于打开状态,应用程序不应在此时对查询得到的结果做下一步处理,而是应该将查询得到的数据备份,关闭ResultSet等与数据库有关的资源并断开与数据库的连接后,对备份数据做进一步处理。

(2) 从提升应用程序性能的角度考虑,不鼓励查询语句用 “select from…” 这种写法,而是将“”替换为目标字段列表,如文件4中的第17~18行和第118~119行。

05、创建测试类

为测试BookDaoImpl类中的方法能否正常运行,可以利用Java的单元测试工具JUnit执行测试。本案例采用的JUnit版本是4.10,在Maven的pom.xml文件中已加入了相关依赖。在src/test/java文件夹下创建一个名为com.example.jdbc.test的包并创建名为BookDaoTest的类。

1) 测试添加功能

单元测试代码如文件5所示。
【文件5】BookDaoTest.java

58b82a0804c07e93492a6a51ed4a7f46.png


8568cac00468ec8fa36324142ff4b91a.png


其中,第4行执行单静态导入,即实现在不声明类名(Assert)的情况下直接调用Assert类的静态方法assertEquals()。@Test、@BeforeClass和@AfterClass都是JUnit中的注解。@Test表示声明一个测试方法,该方法可以作为一个测试用例来运行。由@BeforeClass和@AfterClass标注的方法在所有标注为@Test方法运行之前和运行之后只运行一次。第33行使用了断言方法,断言添加操作是成功的,但代码运行是否成功由JUnit判断。右击文件BookDaoTest,依次选择Run As→JUnit Test命令,执行测试。

可在控制台看到JUnit的测试结果,如图2所示。同时,可通过MySQL客户端查看执行结果,如图3所示。

640.png


■ 图2 控制台显示的单元测试结果


640.png


■ 图3 MySQL客户端查看执行结果


2) 测试列表功能

可在测试类BookDaoTest中增加一个测试方法用于测试列表功能是否正常,代码如下:

640.png


由于Book类已重写了toString()方法,因此,可以直接在控制台将Book对象的属性输出,运行此测试方法后,可在控制台看到当前表中的全部记录,对于修改、删除和检索功能,可以用类似的思路设计测试代码。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
移动开发 开发者 HTML5
构建响应式Web界面:Flexbox与Grid的实战应用
【10月更文挑战第22天】随着互联网的普及,用户对Web界面的要求越来越高,不仅需要美观,还要具备良好的响应性和兼容性。为了满足这些需求,Web开发者需要掌握一些高级的布局技术。Flexbox和Grid是现代Web布局的两大法宝,它们分别由CSS3和HTML5引入,能够帮助开发者构建出更加灵活和易于维护的响应式Web界面。本文将深入探讨Flexbox和Grid的实战应用,并通过具体实例来展示它们在构建响应式Web界面中的强大能力。
42 3
|
2月前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
101 0
|
1天前
|
安全 应用服务中间件 网络安全
实战经验分享:利用免费SSL证书构建安全可靠的Web应用
本文分享了利用免费SSL证书构建安全Web应用的实战经验,涵盖选择合适的证书颁发机构、申请与获取证书、配置Web服务器、优化安全性及实际案例。帮助开发者提升应用安全性,增强用户信任。
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
162 45
|
29天前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
50 1
|
1月前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
60 1
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
56 2
|
3月前
|
JSON Rust 安全
30天拿下Rust之实战Web Server
30天拿下Rust之实战Web Server
79 7
|
2月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
236 0