加载头像

第八章 JSP 中使用数据库

8.1 MySQL 数据库管理系统

MySQL 数据库管理系统,简称 MySQL,是目前流行的开源数据库管理系统,其社区版(MySQL Community Edition)是可免费下载的开源数据库管理系统。

下载 MySQL

MySQL 官方下载地址:https://dev.mysql.com/downloads/windows/installer/8.0.html

下载 JDBC-MySQL 数据库连接器

JDBC-MySQL 数据库连接器官方下载地址:https://downloads.mysql.com/archives/c-j/

8.2 连接 MySQL 数据库

为了使 Java 编写的程序不依赖于具体的数据库,Java 提供了专门用于操作数据库的 API,即 JDBC(Java DataBase Connectivity)。JDBC 操作不同的数据库时,仅仅是加载的数据库连接器不同以及和数据库建立连接的方式不同而已。使用 JDBC 的应用程序和数据库建立连接之后,就可以使用 JDBC 提供的 API 操作数据库。

加载 JDBC-MySQL 数据库连接器

应用程序负责加载的 JDBC-MySQL 连接器,代码如下(注意字符序列和 8.0 版本之前的 com.mysql.jdbc.Driver 不同):

1
2
3
4
try {
// 注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch(Exception e) {}

连接数据库

java.sql 包中的 DriverManager 类有两个用于建立连接的类方法(static 方法):

1
2
Connection getConnection(String url, String user, String password)
Connection getConnection(String url)

上述两个方法都可能抛出 SQL Exception 异常,DriverManager 类调用上述方法可以和数据库建立连接,即可返回一个 Connection 对象。

两种方法的建立连接代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Connection getConnection() {
Connection con = null;
try {
// 注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 定义连接数据库的 url、user、password
String url = "jdbc:mysql://localhost:3306/<数据库名>?useSSL=false&serverTimezone=GMT&characterEncoding=utf-8";
String user = "root";
String password = "123456";
// 获取数据库连接对象
con = DriverManager.getConnection(url,user,password);
System.out.println("数据库连接成功!");
} catch(Exception e) {
e.printStackTrace();
}
// 返回连接对象
return con;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Connection getConnection() {
Connection con = null;
try {
// 注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 定义连接数据库的 url
String url = "jdbc:mysql://localhost:3306/<数据库名>?" +
"useSSL=false&serverTimezone=GMT&&characterEncoding=utf-8" +
"&user=root&password=123456";
// 获取数据库连接对象
con = DriverManager.getConnection(url);
System.out.println("数据库连接成功!");
} catch(Exception e) {
e.printStackTrace();
}
// 返回连接对象
return con;
}

8.3 查询记录

和数据库建立连接后,就可以使用 JDBC 提供的 API 与数据库交互信息,例如查询、修改和更新数据库中的表等。JDBC 与数据库表进行交互的主要方式是使用 SQL 语句。JDBC 提供的 API 可以将标准的 SQL 语句发送给数据库,实现和数据库的交互。

结果集与查询

对一个数据库中的表进行查询,然后将查询结果返回到一个 ResultSet 对象中,习惯称 ResultSet 对象为结果集对象。

使用 Statement 声明一个 SQL 语句对象,然后让已创建的连接对象 con 调用方法 createStatement() 返回 SQL 语句对象,代码如下:

1
2
3
4
5
try {
Statement sql = con.createStatement();
} catch (SQLException e) {
System.out.println(e);
}

有了 SQL 语句对象后,这个对象就可以调用相应的方法查询数据库中的表,并将查询结果存放在一个 ResultSet 结果集中。也就是说 SQL 查询语句对数据库的查询操作将返回一个 ResultSet 结果集,ResultSet 结果集由以列(字段)为结构的数据行组成。例如:

数据表 bookList 结构

ISBN name price publish_date
978-7-302-55980-1 《 JSP 实用教程》 59.80¥ 2020.7
1
ResultSet rs = sql.executeQuery("SELECT * FROM bookList");

内存中的结果集对象 rs 的列数是 4 列,刚好和 bookList 表的列数相同,第 1 列至第 4 列分别是 ISBN、name、price、publish_date 列。

ResultSet 结果集一次只能看到一个数据行,使用 next() 方法可以查询下一数据行。获得一行数据后,ResultSet 结果集可以使用 getXxx 方法获得列(字段)值,将位置索引(第一列用 1,第二列用 2 等)或列名传递给 getXxx 方法的参数即可。

下表给出了 ResultSet 结果集的若干方法:

返回类型 方法名称
boolean next()
byte getByte(int columnIndex)
getByte(String columnName)
Date getDate(int columnIndex)
getDate(String columnName)
double getDouble(int columnIndex)
getDouble(String columnName)
float getFloat(int columnIndex)
getFloat(String columnName)
int getInt(int columnIndex)
getInt(String columnName)
long getLong(int columnIndex)
getLong(String columnName)
String getString(int columnIndex)
getString(String columnName)

无论列(字段)是何种属性,都可以使用 getString 方法返回列(字段)值的字符串表示。

8.4 更新、添加与删除记录

Statement 对象调用方法:

1
public int executeUpdate(String sqlStatement);

通过参数 sqlStatement 指定的方式实现对数据库表中记录的更新、添加和删除操作。方法执行成功(成功更新、添加或删除),将返回一个正整数,否则返回 0。

更新

1
UPDATESET 字段 = 新值 WHERE <条件子句>

添加

1
INSERT INTOVALUES (列 1 的值, 列 2 的值, ..., 列 n 的值)

删除

1
DELETE FROMWHERE <条件子句>

8.5 预处理语句

Java 提供了更高效率的数据库操作机制,就是 PreparedStatement 对象,该对象被习惯地称作预处理语句对象。

预处理语句的优点

当向数据库发送一个 SQL 语句,例如 SELECT * FROM bookList,数据库中的 SQL 解释器负责将把 SQL 语句生成底层的内部命令,然后执行该命令,完成有关的数据操作。如果不断地向数据库提交 SQL 语句势必增加数据库中 SQL 解释器的负担,影响执行的速度。如果应用程序能针对连接的数据库,事先就将 SQL 语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。

Connection 连接对象 con 调用 prepareStatement(String sql) 方法:

1
PreparedStatenent pre = con.prepareStatement(String sql);

对参数 sql 指定的 SQL 语句进行预编译处理,生成该数据库底层的内部部命令,并将该命令封装在 PreparedStatement 对象 pre 中,那么该对象调用下列方法都可以使得该底层内部命令被数据库执行:

1
2
3
ResultSet executeQuery()
boolean execute() // 执行成功返回 false
int executeUpdate() // 执行成功返回 1

只要编译好了 PreparedStatement 对象 pre,那么 pre 就可以随时执行上述方法,显然提高了访问数据库的速度。

使用通配符

在对 SQL 进行预处理时可以使用通配符 ? 来代替字段的值,只要在预处理语句执行之前再设置通配符所表示的具体值即可。例如:

1
PreparedStatenent pre = con.prepareStatement("SELECT * FROM bookList WHERE price < ?");

那么在 pre 对象执行之前,必须调用相应的方法设置通配符 ? 代表的具体值,例如:

1
pre.setFloat(1, 65);

指定上述预处理语句 pre 中通配符 ? 代表的值是 65。通配符按照它们在预处理语句的 SQL 语句中从左至右依次出现的顺序分别被称作第 1 个、第 2 个……第 m 个通配符。

8.6 事务

事务由一组 SQL 语句组成。所谓“事务处理”是指应用程序保证事务中的 SQL 语句要么全部都执行,要么一个都不执行。

事务处理是保证数据库中数据完整性与一致性的重要机制。应用程序和数据库建立连接之后,可能使用多条 SQL 语句操作数据库中的一个表或多个表。一个管理资金转账的应用程序为了完成一个简单的转账业务可能需要两条 SQL 语句,例如,用户 1 给另一个用户 2 转账 50 元,那么需要一条 SQL 语句完成将用户 1 的 userMoney 的值由原来的 100 更改为 50(减去 50 的操作),另一条 SQL 语句完成将 2 的用户的 userMoney 的值由原来的 20 更新为 70(增加 50 的操作)。应用程序必须保证这两条 SQL 语句要么全都执行,要么全都不执行。

JDBC 事务处理步骤如下:

  1. setAutoCommit(boolean b) 方法关闭自动提交模式

    事务处理的第一步骤是使用 setAutoCommit(boolean autoCommit) 方法关闭自动提交模式。

    这样做的理由是,和数据库建立连接的对象 con 的提交模式是自动提交模式,即该连接 con 产生的 Statement 或 PreparedStatement 对象对数据库提交任何一个 SQL 语句操作都会立刻生效,使得数据库中的数据发生变化,这显然不能满足事物处理的要求。

    例如,用户 1 给另一个用户 2 转账 50 元,那么需要一条 SQL 语句完成将用户 1 的 userMoney 的值由原来的 100 更改为 50(减去 50 的操作),另一条 SQL 语句完成将 2 的用户的 userMoney 的值由原来的 20 更新为 70(增加 50 的操作)。应用程序必须保证这两条 SQL 语句要么全都执行,要么全都不执行。

    因此,为了能进行事务处理,必须关闭 con 的自动提交模式(自动提交模式是连接 con 的默认设置)。连接对象 con 首先调用 setAutoCommit(boolean autoCommit) 方法,将参数 autoCommit 取值为 false 来关闭自动提交模式:

    1
    con.setAutoCommit(false);
  2. commit() 方法处理事务

    连接对象 con 调用 setAutoCommit(false) 后,产生的 Statement 对象对数据库提交任何一个 SQL 语句操作都不会立刻生效,这样一来,就有机会让 Statement 对象(或 PreparedStatement 对象)提交多个 SQL 语句,这些 SQL 语句就是一个事务。事务中的 SQL 语句不会立刻生效,直到连接对象 con 调用 commit() 方法。

    连接对象 con 调用 commit() 方法就是让事务中的 SQL 语句全部生效。

  3. rollback() 方法处理事务失败

    连接对象 con 调用 commit() 方法进行事务处理时,只要事务中任何一个 SQL 语句没有生效,就抛出 SQLException 异常。在处理 SQLException 异常时,必须让 con 调用 rollback() 方法,其作用是:撤销事务中成功执行过的 SQL 语句对数据库数据所做的更新、插入或删除操作,即撤销引起数据发生变化的 SQL 语句操作,将数据库中的数据恢复到 commit() 方法执行之前的状态。


返回目录 上一章 下一章
博客快捷键
shift K
关闭快捷键功能
shift A
打开/关闭中控台
shift M
播放/暂停音乐
shift D
深色/浅色显示模式
shift S
站内搜索
shift R
随机访问
shift H
返回首页
shift L
友链页面
shift P
关于本站
shift I
原版/本站右键菜单
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體