写点什么

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

作者:TiAmo
  • 2023-05-12
    江苏
  • 本文字数:3072 字

    阅读完需:约 10 分钟

简介: 在项目开发中,应用程序需要的数据基本都是存放在数据库中的。对数据的管理过程离不开数据库。本文将运用 JDBC API 编写一个实现基本数据库操作(添加、修改、删除、查询)的应用程序,实现对图书信息的管理。 完成此项目的具体步骤如下。


(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 iif(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







在应用 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




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


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



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



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

2) 测试列表功能


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



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

发布于: 刚刚阅读数: 3
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

评论

发布
暂无评论
Java Web实战 | JDBC案例:实现图书管理_JDBC_TiAmo_InfoQ写作社区