Java后端学习系列(6):Java数据库操作基础(JDBC)
前言
在前面的学习中,我们掌握了Java网络编程的基础知识,了解了如何让不同的计算机之间通过网络进行通信。而在实际的Java后端开发中,与数据库进行交互也是极为关键的一部分,它能够帮助我们持久化存储和管理数据。JDBC(Java Database Connectivity)作为Java连接数据库的标准接口,为我们提供了便捷的方式来操作各类数据库。本期我们就来深入学习Java数据库操作基础(JDBC),继续拓展我们的Java后端知识体系。本系列共15期,会持续为大家呈现重要且实用的内容。
一、JDBC的基本概念与架构
1.1 基本概念
JDBC是一种用于执行SQL语句的Java API,它提供了一组标准的接口,允许Java程序与不同的数据库管理系统(如MySQL、Oracle、SQL Server等)进行交互,而无需关心具体数据库的实现细节。通过JDBC,我们可以在Java程序中方便地进行数据库连接、数据查询、插入、更新以及删除等操作。
1.2 架构组成
JDBC的架构主要由以下几个部分组成:
- JDBC API:这是面向Java程序员的接口,定义了一系列用于与数据库交互的类和方法,例如
Connection
(用于建立与数据库的连接)、Statement
(用于执行静态SQL语句)、ResultSet
(用于存储查询结果集)等。 - JDBC Driver Manager:负责加载合适的数据库驱动,并管理数据库连接。它根据应用程序提供的数据库连接信息,查找并加载对应的驱动程序,然后建立与数据库的连接。
- JDBC Drivers:即数据库驱动,是针对不同数据库系统实现的具体驱动程序,它们实现了JDBC API中定义的接口,将JDBC的调用转换为对相应数据库的原生操作,使得Java程序能够与特定的数据库进行通信。例如,MySQL有对应的MySQL JDBC驱动,Oracle有其专用的Oracle JDBC驱动等。
二、数据库连接的建立与配置
2.1 导入数据库驱动
首先,要使用特定的数据库,需要下载并导入对应的JDBC驱动包到项目中。以MySQL为例,如果使用Maven项目管理工具,可以在项目的pom.xml
文件中添加以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>具体版本号</version>
</dependency>
如果是普通的Java项目,则需要将下载好的mysql-connector-java.jar
文件添加到项目的类路径下。
2.2 建立连接
在导入驱动后,就可以通过JDBC来建立与数据库的连接了。示例代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcConnectionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try {
// 加载驱动(在Java 6及以后版本,这一步通常可省略,驱动会自动加载)
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("成功连接到数据库");
connection.close();
} catch (ClassNotFoundException | SQLException e) {
System.out.println("连接数据库出现异常:" + e.getMessage());
}
}
}
在上述代码中,需要将your_database_name
替换为实际的数据库名称,your_username
和your_password
替换为对应的数据库用户名和密码。url
字符串指定了数据库的连接地址,不同的数据库其格式会稍有不同,比如Oracle数据库的连接地址格式就不一样。
三、SQL语句在Java中的执行
3.1 使用Statement执行SQL语句
在建立连接后,可以使用Statement
对象来执行SQL语句。例如,执行一个简单的查询语句:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class JdbcStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
// 创建Statement对象
Statement statement = connection.createStatement();
// 执行查询语句
String sql = "SELECT * FROM your_table_name";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
// 获取查询结果中的数据,例如获取某列的值
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
resultSet.close();
statement.close();
connection.close();
} catch (ClassNotFoundException | SQLException e) {
System.out.println("执行SQL语句出现异常:" + e.getMessage());
}
}
}
这里同样要将your_table_name
替换为实际的表名,通过ResultSet
可以遍历查询到的结果集,获取每一行的数据信息。
3.2 使用PreparedStatement(推荐)
PreparedStatement
是Statement
的子接口,它具有更好的性能和安全性,尤其是在执行带有参数的SQL语句时。例如,执行插入语句:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JdbcPreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
// 预编译带有参数的插入语句
String sql = "INSERT INTO your_table_name (name, age) VALUES (?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "John");
preparedStatement.setInt(2, 30);
// 执行插入操作
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();
} catch (ClassNotFoundException | SQLException e) {
System.out.println("使用PreparedStatement出现异常:" + e.getMessage());
}
}
}
使用PreparedStatement
可以有效防止SQL注入攻击,并且在多次执行相似结构的SQL语句时,由于其预编译的特性,能提高执行效率。
四、事务处理基础与应用
4.1 事务的概念
事务是一组数据库操作的逻辑单元,这些操作要么全部成功执行,要么全部不执行,保证了数据的一致性和完整性。例如,在银行转账场景中,从一个账户扣款和向另一个账户收款这两个操作就应该放在一个事务中,确保转账操作的原子性,避免出现只扣了款但没收款或者反之的情况。
4.2 在JDBC中处理事务
在JDBC中,可以通过Connection
对象来控制事务。示例如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JdbcTransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
// 关闭自动提交,开启事务
connection.setAutoCommit(false);
try {
String sql1 = "UPDATE account_table SET balance = balance - 100 WHERE account_id = 1";
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
preparedStatement1.executeUpdate();
String sql2 = "UPDATE account_table SET balance = balance + 100 WHERE account_id = 2";
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
preparedStatement2.executeUpdate();
// 提交事务
connection.commit();
} catch (SQLException e) {
// 出现异常则回滚事务
connection.rollback();
System.out.println("事务执行出现异常,已回滚:" + e.getMessage());
}
connection.close();
} catch (ClassNotFoundException | SQLException e) {
System.out.println("事务处理出现异常:" + e.getMessage());
}
}
}
在上述代码中,首先通过connection.setAutoCommit(false)
关闭了自动提交功能,然后执行一系列的数据库操作,若操作都成功则通过connection.commit()
提交事务,若出现异常则通过connection.rollback()
回滚事务,保证数据的一致性。
五、下一步学习建议
- 实践操作:在本地搭建不同的数据库环境(如MySQL、Oracle等),使用JDBC与它们进行交互,尝试执行各种复杂的SQL语句,包括多表查询、子查询等,同时多运用事务处理来模拟实际业务场景中的数据操作,加深对JDBC的理解和掌握。
- 数据库优化:学习数据库的性能优化知识,了解索引、查询优化等概念,结合JDBC操作,思考如何在代码层面优化数据库访问,提高程序的整体性能。
- 框架整合:了解一些基于JDBC之上的开源框架(如Hibernate、MyBatis等),看看它们是如何对JDBC进行封装和扩展的,为后续学习更高级的数据库访问技术做准备。
下期预告
《Java后端学习系列(7):常用Java Web框架介绍(Servlet与JSP)》
- Servlet的基本概念与开发流程
- JSP的原理与基本应用
- Servlet与JSP的结合使用
- 简单的Java Web应用示例
掌握好JDBC对于Java后端开发来说至关重要,希望大家通过不断实践和探索,熟练运用它来操作数据库。如果在学习过程中有任何疑问或者心得,欢迎在评论区分享交流,我们下期再见。