本文目录导读:
《JavaWeb数据库访问技术实验报告》
实验目的
1、掌握在JavaWeb环境下连接数据库的基本方法。
2、熟练运用JDBC(Java Database Connectivity)对数据库进行增、删、改、查操作。
图片来源于网络,如有侵权联系删除
3、理解数据库事务处理的概念和实现方式。
4、能够构建简单的JavaWeb应用,实现与数据库的交互功能。
实验环境
1、操作系统:Windows 10
2、开发工具:Eclipse IDE for Java EE Developers
3、数据库管理系统:MySQL 8.0
4、JDBC驱动:mysql - connector - java - 8.0.26
(一)数据库连接
1、在MySQL中创建一个名为testdb
的数据库,并创建一个名为users
的表,表结构如下:
```sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
);
```
2、在Java项目中导入JDBC驱动包。
3、编写数据库连接代码:
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
private static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL = false&serverTimezone = UTC";
private static final String USERNAME = "root";
private static final String PASSWORD = "your_password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
}
```
(二)数据查询操作
1、编写查询users
表中所有用户信息的方法:
```java
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UserQuery {
public static void queryAllUsers() {
try (Connection connection = DatabaseConnection.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users")) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
System.out.println("ID: " + id + ", Username: " + username + ", Password: " + password);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
(三)数据插入操作
1、编写向users
表中插入新用户的方法:
```java
图片来源于网络,如有侵权联系删除
public class UserInsert {
public static void insertUser(String username, String password) {
try (Connection connection = DatabaseConnection.getConnection();
Statement statement = connection.createStatement()) {
String sql = "INSERT INTO users (username, password) VALUES ('" + username + "', '" + password + "')";
int rowsAffected = statement.executeUpdate(sql);
if (rowsAffected > 0) {
System.out.println("User inserted successfully.");
} else {
System.out.println("Insertion failed.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
(四)数据更新操作
1、编写更新users
表中用户密码的方法:
```java
public class UserUpdate {
public static void updatePassword(int id, String newPassword) {
try (Connection connection = DatabaseConnection.getConnection();
Statement statement = connection.createStatement()) {
String sql = "UPDATE users SET password = '" + newPassword + "' WHERE id = " + id;
int rowsAffected = statement.executeUpdate(sql);
if (rowsAffected > 0) {
System.out.println("Password updated successfully.");
} else {
System.out.println("Update failed.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
(五)数据删除操作
1、编写删除users
表中用户的方法:
```java
public class UserDelete {
public static void deleteUser(int id) {
try (Connection connection = DatabaseConnection.getConnection();
Statement statement = connection.createStatement()) {
String sql = "DELETE FROM users WHERE id = " + id;
int rowsAffected = statement.executeUpdate(sql);
if (rowsAffected > 0) {
System.out.println("User deleted successfully.");
} else {
System.out.println("Deletion failed.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
图片来源于网络,如有侵权联系删除
(六)事务处理
1、假设要实现一个转账功能,从一个用户账户转移一定金额到另一个用户账户,这涉及到两个更新操作(一个账户余额减少,另一个账户余额增加),需要在一个事务中完成。
```java
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class TransactionExample {
public static void transferMoney(int fromUserId, int toUserId, double amount) {
Connection connection = null;
try {
connection = DatabaseConnection.getConnection();
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
// 减少转出账户余额
String sql1 = "UPDATE accounts SET balance = balance - " + amount + " WHERE id = " + fromUserId;
statement.executeUpdate(sql1);
// 增加转入账户余额
String sql2 = "UPDATE accounts SET balance = balance + " + amount + " WHERE id = " + toUserId;
statement.executeUpdate(sql2);
connection.commit();
System.out.println("Transfer successful.");
} catch (SQLException e) {
if (connection!= null) {
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (connection!= null) {
try {
connection.setAutoCommit(true);
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
```
实验结果
1、通过运行UserQuery
类中的queryAllUsers
方法,可以成功查询到users
表中的用户信息。
2、运行UserInsert
类的insertUser
方法,能够向表中插入新的用户记录,并得到相应的成功或失败提示。
3、执行UserUpdate
类的updatePassword
方法可以正确更新用户密码,UserDelete
类的deleteUser
方法也能成功删除指定用户。
4、在TransactionExample
类的transferMoney
方法测试中,当转账操作正常时,数据库中的账户余额能够正确更新;当出现异常(如模拟数据库连接中断等情况)时,事务能够回滚,保证数据的一致性。
1、收获
- 通过本次实验,深入理解了JDBC在JavaWeb中的重要性和基本使用方法,能够熟练地使用JDBC连接数据库,执行各种SQL操作,这为开发更复杂的JavaWeb应用奠定了基础。
- 掌握了数据库事务处理的概念和实现方式,事务处理在保证数据一致性和完整性方面具有关键作用,尤其是在涉及多个数据库操作时,如转账操作中的余额增减操作。
- 在编写代码过程中,对Java的异常处理机制有了更深入的理解,合理地处理数据库操作中的异常,可以提高应用的稳定性和可靠性。
2、不足与改进
- 在代码编写方面,目前的SQL语句是直接拼接字符串的方式,这种方式存在SQL注入的风险,在实际应用中,应该采用预编译语句(PreparedStatement)来避免SQL注入攻击。
- 在处理数据库连接时,目前的代码没有很好地实现连接池技术,在高并发的应用场景下,频繁地创建和关闭数据库连接会影响性能,未来可以引入数据库连接池框架,如C3P0或Druid,来优化数据库连接管理。
- 对于事务处理,如果涉及到分布式数据库或者多个数据源的情况,目前的本地事务处理方式将不再适用,需要学习和研究分布式事务处理技术,如基于XA协议的事务处理或者使用Seata等分布式事务框架。
评论列表