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

JDBC与数据库连接池

引言

在Java开发中,数据库操作是非常常见的需求。为了简化数据库操作,Java提供了JDBC(Java Database Connectivity)API,它允许Java程序员通过统一的接口访问不同的数据库。本文将详细介绍JDBC的基本原理、使用方法、以及如何通过数据库连接池优化数据库连接。

JDBC概述

JDBC的基本原理

JDBC为Java程序员提供了一套用于数据库操作的接口API。通过JDBC,Java程序员可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。JDBC的核心思想是“面向接口编程”,即Java程序员只需要面向JDBC API编程,而不需要关心底层数据库的具体实现。

JDBC带来的好处

  1. 统一的接口:JDBC为不同的数据库提供了统一的接口,屏蔽了底层数据库的差异。
  2. 灵活性:Java程序员可以通过JDBC连接任何支持JDBC的数据库系统。
  3. 简化开发:JDBC API简化了数据库操作的复杂性,开发者只需关注业务逻辑。

JDBC程序编写步骤

  1. 注册驱动:加载数据库驱动程序。
  2. 获取连接:通过DriverManager获取数据库连接。
  3. 执行SQL:通过StatementPreparedStatement执行SQL语句。
  4. 释放资源:关闭连接,释放资源。

JDBC第一个程序

以下是一个简单的JDBC程序示例,展示了如何通过JDBC对数据库表进行增删改查操作。

package JDBC_;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBC01_ {
    public static void main(String[] args) throws SQLException {
        // 1、注册驱动
        Driver driver = new com.mysql.cj.jdbc.Driver();
        
        // 2、得到连接
        String url = "jdbc:mysql://127.0.0.1:3306/mysql_learn?characterEncoding=utf-8&serverTimezone=UTC";
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "123456");

        Connection connect = driver.connect(url, properties);
        
        // 3、执行SQL
        String sql = "INSERT INTO actor values(2,'MM','女','2022-05-10 14:50:59','15371009565')";
        Statement statement = connect.createStatement();
        int rows = statement.executeUpdate(sql);
        System.out.println("新增了:" + rows + " 条数据");
        
        // 4、释放资源
        statement.close();
        connect.close();
    }
}

获取数据库连接的5种方式

方式一:直接使用DriverManager

Driver driver = new com.mysql.cj.jdbc.Driver();
String url = "jdbc:mysql://127.0.0.1:3306/mysql_learn?characterEncoding=utf-8&serverTimezone=UTC";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");

Connection connect = driver.connect(url, properties);

方式二:通过反射加载驱动

Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();

String url = "jdbc:mysql://127.0.0.1:3306/mysql_learn?characterEncoding=utf-8&serverTimezone=UTC";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");

Connection connect = driver.connect(url, properties);

方式三:使用DriverManager注册驱动

Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();

String url = "jdbc:mysql://127.0.0.1:3306/mysql_learn?characterEncoding=utf-8&serverTimezone=UTC";
String user = "root";
String password = "123456";

DriverManager.registerDriver(driver);
Connection connection = DriverManager.getConnection(url, user, password);

方式四:简化版

Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/mysql_learn?characterEncoding=utf-8&serverTimezone=UTC";
String user = "root";
String password = "123456";

Connection connection = DriverManager.getConnection(url, user, password);

方式五:通过配置文件获取连接

Properties properties = new Properties();
properties.load(new FileInputStream("src/application.properties"));

String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");

Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password);

PreparedStatement与SQL注入

SQL注入问题

SQL注入是一种常见的安全漏洞,攻击者可以通过在输入中插入恶意SQL语句来操纵数据库查询。例如:

SELECT * FROM actor WHERE id = '1' OR '1'='1';

使用PreparedStatement防止SQL注入

PreparedStatement通过预编译SQL语句并使用参数化查询,可以有效防止SQL注入。

String sql = "SELECT * FROM actor WHERE id = ? AND name = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "1");
statement.setString(2, "MM");
ResultSet resultSet = statement.executeQuery();

数据库连接池

传统连接的问题

  1. 频繁连接:每次操作都需要建立和关闭连接,消耗大量资源。
  2. 资源泄漏:如果连接未正确关闭,可能导致内存泄漏。
  3. 性能瓶颈:连接数过多时,数据库可能崩溃。

数据库连接池的优势

  1. 连接复用:预先创建一定数量的连接,使用时从池中获取,使用完毕后放回池中。
  2. 资源管理:连接池负责分配、管理和释放连接,避免资源泄漏。
  3. 性能提升:减少频繁创建和关闭连接的开销,提升系统性能。

常见的数据库连接池

  1. C3P0:稳定性较好,但速度较慢。
  2. DBCP:速度较快,但稳定性较差。
  3. Druid:阿里开源的连接池,集成了多种连接池的优点。

Druid连接池示例

@Test
public void druidTest001() throws Exception {
    Properties properties = new Properties();
    properties.load(new FileInputStream("src/druid.properties"));

    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

    Connection connection = dataSource.getConnection();
    System.out.println("连接成功!");
    connection.close();
}

事务管理

事务的基本概念

事务是数据库操作的最小单位,具有ACID特性(原子性、一致性、隔离性、持久性)。在JDBC中,默认情况下每个SQL语句都是一个独立的事务,自动提交。

使用事务保证数据一致性

connection.setAutoCommit(false); // 关闭自动提交
try {
    // 执行SQL
    connection.commit(); // 提交事务
} catch (SQLException e) {
    connection.rollback(); // 回滚事务
} finally {
    connection.setAutoCommit(true); // 恢复自动提交
}

批处理

批处理的优势

批处理允许一次性提交多条SQL语句,减少与数据库的交互次数,提升性能。

批处理示例

connection.setAutoCommit(false);
PreparedStatement statement = connection.prepareStatement("INSERT INTO actor VALUES (?, ?, ?, ?, ?)");

for (int i = 0; i < 10000; i++) {
    statement.setInt(1, i);
    statement.setString(2, "Name" + i);
    statement.setString(3, "男");
    statement.setString(4, "2022-05-10 14:50:59");
    statement.setString(5, "1234567890");
    statement.addBatch();
}

statement.executeBatch();
connection.commit();

总结

JDBC是Java操作数据库的核心技术,通过JDBC API,Java程序员可以轻松连接和操作各种数据库。为了提高数据库操作的效率和安全性,我们可以使用PreparedStatement防止SQL注入,使用数据库连接池管理连接,以及通过事务和批处理优化数据库操作。

相关文章:

  • Java学习--JWT令牌
  • LLM - 使用 Unsloth 框架 轻量级 训练 GRPO 算法 教程
  • cursor+deepseek实现完整的俄罗斯方块小游戏
  • ES 聚合查询
  • 数据安全的守护者:备份文件的重要性及自动化备份策略
  • 自学嵌入式第28天-----select,
  • BambuStudio学习笔记:MarchingSquares类
  • mysql中如何保证没有幻读发生
  • 道可云人工智能每日资讯|亚马逊云业务部门成立智能体人工智能团队
  • 解析调控网络之竞争结合
  • 只要四行代码就能解决mac上运行exe文件的问题
  • 05-2基于vs2022的c语言笔记——表达式
  • Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障
  • 深度学习Save Best、Early Stop
  • Quadrotor-NMPC-Control 开源项目复现与问题记录
  • 03.06 QT
  • ComfyUI进阶教程核心要点与详解
  • 多模态模型在做选择题时,如何设置Prompt,如何精准定位我们需要的选项
  • 【Kubernetes 指南】基础入门——Kubernetes 基本概念(四)
  • Python在DevOps中的应用:自动化CI/CD管道的实现
  • dede网站模板免费下载/大连今日新闻头条
  • 福州市交通建设集团有限公司 网站/互联网产品营销策划方案
  • 本地的丹阳网站建设/免费站推广网站2022
  • vps怎么做网站/百度搜索百度
  • wordpress index.php 跳转/seo全网图文推广
  • 网站建设中敬请期待/seo搜索引擎入门教程