当前位置: 首页 > news >正文

JDBC的连接过程(超详细)

JDBC(Java Database Connectivity)是 Java 用于访问数据库的标准 API,它允许 Java 程序与各种不同类型的数据库进行交互, 其连接数据库的过程主要包含以下几个步骤:

1. 导入 JDBC 驱动依赖

在使用 JDBC 连接数据库之前,需要导入相应数据库的 JDBC 驱动。如果是使用 Maven 构建项目,以 MySQL 为例,在pom.xml文件中添加如下依赖:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version> <!-- 根据实际需求选择版本 -->
</dependency>

2. 加载 JDBC 驱动

在 Java 代码中,需要加载数据库的 JDBC 驱动,让 Java 程序知道使用哪个驱动来连接数据库。使用Class.forName()方法加载驱动类,例如连接 MySQL 数据库

try {Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {e.printStackTrace();
}

3. 建立数据库连接

使用DriverManager.getConnection()方法来建立与数据库的连接,该方法需要传入数据库的 URL、用户名和密码。以下是不同数据库连接 URL 的示例:

  • MySQL
String url = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:mysql://是 MySQL 的 JDBC URL 前缀,localhost是数据库主机地址,3306是端口号,mydatabase是数据库名,后面的参数用于配置连接属性,如关闭 SSL 验证和设置时区。

  • PostgreSQL
String url = "jdbc:postgresql://localhost:5432/mydatabase";
String username = "postgres";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:postgresql://是 PostgreSQL 的 JDBC URL 前缀,5432是默认端口号。

  • Oracle
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "tiger";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:oracle:thin:是 Oracle 的 JDBC URL 前缀,1521是默认端口号,orcl是数据库实例名。

4. 创建 Statement 对象

连接建立后,需要创建StatementPreparedStatementCallableStatement对象,用于执行 SQL 语句

  • Statement:最基本的用于执行 SQL 语句的对象,适用于执行静态 SQL 语句,例如:
try (java.sql.Statement statement = connection.createStatement()) {// 执行SQL查询java.sql.ResultSet resultSet = statement.executeQuery("SELECT * FROM users");while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
  • PreparedStatement:预编译 SQL 语句,能有效防止 SQL 注入攻击,并且性能更好,适用于执行动态 SQL 语句,例如:
String sql = "SELECT * FROM users WHERE username = ?";
try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, "admin");java.sql.ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
  • CallableStatement:用于执行数据库中的存储过程,例如:
String sql = "{call get_user_count(?)}";
try (java.sql.CallableStatement callableStatement = connection.prepareCall(sql)) {callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);callableStatement.execute();int count = callableStatement.getInt(1);System.out.println("用户数量: " + count);
} catch (java.sql.SQLException e) {e.printStackTrace();
}

5. 执行 SQL 语句

根据不同的需求,使用上述创建的对象执行 SQL 语句,如executeQuery()用于执行查询语句并返回结果集(ResultSet),executeUpdate()用于执行增删改操作并返回受影响的行数,execute()用于执行任意 SQL 语句并返回一个布尔值表示是否返回结果集。

6. 处理结果集(如果有)

当执行查询语句后,会得到一个ResultSet对象,通过调用ResultSet的方法(如getString()getInt()等)来获取查询结果集中的数据,并进行相应的处理。

7. 关闭资源

在完成数据库操作后,需要按照ResultSetStatement(或PreparedStatementCallableStatement)、Connection的顺序关闭资源,以释放数据库连接和其他相关资源,防止资源泄漏。示例代码如下:

java.sql.ResultSet resultSet = null;
java.sql.PreparedStatement preparedStatement = null;
try {// 执行操作...
} catch (java.sql.SQLException e) {e.printStackTrace();
} finally {if (resultSet != null) {try {resultSet.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
}

或者使用 Java 7 引入的try-with-resources语句,它会自动关闭实现了AutoCloseable接口的资源,简化代码编写:

try (java.sql.Connection connection = DriverManager.getConnection(url, username, password);java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql);java.sql.ResultSet resultSet = preparedStatement.executeQuery()) {// 处理结果集...
} catch (java.sql.SQLException e) {e.printStackTrace();
}

完美撒花~

http://www.dtcms.com/a/324110.html

相关文章:

  • 【Docker-Day 12】揭秘容器网络:深入理解 Docker Bridge 模式与端口映射
  • Python爬虫-爬取政务网站的文档正文内容和附件数据
  • 【Linux | 网络】数据链路层
  • 电脑清理3步速成法
  • 三相LLC拓扑分析
  • CompletableFuture实现Excel sheet页导出
  • 产品经理入门 - 产品解决方案(需求分析、 功能优先级划分、功能价值、用户体验)
  • RabbitMQ面试精讲 Day 19:网络调优与连接池管理
  • NLP---IF-IDF案例分析
  • AI编程插件对比分析:CodeRider、GitHub Copilot及其他
  • 构建企业级Odoo 18 WMS——功能、架构与拓展蓝图
  • 宝塔面板部署sentinel
  • 【传奇开心果系列】基于Flet框架开发的增强版“Hello World“应用程序学习flet框架的拔高起点
  • 【后端】Java 8 特性 `User::getId` 语法(方法引用)介绍
  • Linux常用命令(后端开发版)
  • SQL(结构化查询语言)的四大核心分类
  • 【后端】Java 8 特性 Optional 可选类 介绍
  • Oracle 19C 查看卡慢的解决思路
  • Spring Boot整合knife4j实战
  • iceberg安装部署
  • imx6ull支持4G模块
  • C++高频知识点(十八)
  • 生产环境中Spring Cloud Sleuth与Zipkin分布式链路追踪实战经验分享
  • 咪咕MGV3200-KLH_GK6323V100C_板号E503744_安卓9_短接强刷包-可救砖
  • uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?
  • CD64.【C++ Dev】多态(3): 反汇编剖析单继承下的虚函数表
  • CPP继承
  • Qt—— 下载、工具介绍以及新建项目
  • 机器学习 [白板推导](八)[EM算法]
  • 机器学习-----K-means算法介绍