Java 数据库连接(JDBC)的使用,包括连接数据库、执行SQL语句等

一、简介

Java Database Connectivity(JDBC)是Java应用程序与关系数据库进行交互的一种API。它提供了一组用于访问和操作数据库的标准接口,使开发人员能够使用Java代码执行数据库操作,如查询、插入、更新和删除等。

二、JDBC架构

JDBC由两部分组成:

  1. JDBC API:由Java SE平台提供的接口和类集合,用于定义与数据库交互的标准。
  2. JDBC Driver API:由数据库供应商提供的具体实现,用于实际连接和操作数据库。
三、JDBC的核心组件
  1. DriverManager:管理一组数据库驱动程序的基本服务。
  2. Connection:表示与特定数据库的连接。
  3. Statement:用于执行SQL语句的对象,分为StatementPreparedStatementCallableStatement
  4. ResultSet:保存由Statement对象执行SQL查询返回的结果集。
  5. SQLException:处理数据库访问出错或其他错误的异常。
四、使用JDBC的步骤
  1. 加载驱动程序
  2. 建立数据库连接
  3. 创建SQL语句
  4. 执行SQL语句
  5. 处理结果集
  6. 关闭连接
五、具体实现
1. 加载驱动程序

在JDBC 4.0之后,驱动程序通常会自动加载,但为了兼容性,手动加载仍然常见。

try {
    Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
2. 建立数据库连接

使用DriverManager获取数据库连接。

String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";

Connection connection = null;

try {
    connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
    e.printStackTrace();
}
3. 创建SQL语句

使用StatementPreparedStatement对象创建SQL语句。

Statement statement = connection.createStatement();
String sql = "SELECT * FROM users";

对于参数化查询,使用PreparedStatement

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
4. 执行SQL语句

根据SQL语句的类型,使用executeQueryexecuteUpdate方法执行。

查询操作:

ResultSet resultSet = statement.executeQuery(sql);

更新操作:

String updateSql = "UPDATE users SET name = 'John' WHERE id = 1";
int rowsAffected = statement.executeUpdate(updateSql);
5. 处理结果集

ResultSet对象包含查询结果,可以通过next方法迭代访问。

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}
6. 关闭连接

为了防止资源泄露,必须关闭数据库连接、语句和结果集。

try {
    if (resultSet != null) resultSet.close();
    if (statement != null) statement.close();
    if (connection != null) connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}
六、示例代码

以下是一个完整的JDBC示例程序,展示了如何连接到MySQL数据库,执行查询并处理结果集。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "password";

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 加载驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 建立连接
            connection = DriverManager.getConnection(url, user, password);

            // 创建语句
            statement = connection.createStatement();
            String sql = "SELECT * FROM users";

            // 执行查询
            resultSet = statement.executeQuery(sql);

            // 处理结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            try {
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
七、使用PreparedStatement防止SQL注入

Statement相比,PreparedStatement可以有效防止SQL注入。

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
ResultSet resultSet = preparedStatement.executeQuery();

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}
八、事务处理

JDBC默认是自动提交模式。可以通过关闭自动提交模式来手动管理事务。

try {
    connection.setAutoCommit(false);

    // 执行多个更新操作
    statement.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");
    statement.executeUpdate("INSERT INTO users (name) VALUES ('Bob')");

    // 提交事务
    connection.commit();
} catch (SQLException e) {
    try {
        // 回滚事务
        connection.rollback();
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
} finally {
    try {
        connection.setAutoCommit(true);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
九、使用连接池

为了提高性能,减少连接的频繁创建和销毁,推荐使用连接池。常用的连接池实现有Apache DBCP、C3P0和HikariCP。

以下是使用HikariCP的示例:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class HikariCPDemo {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
        config.setUsername("root");
        config.setPassword("password");
        DataSource dataSource = new HikariDataSource(config);

        try (Connection connection = dataSource.getConnection()) {
            String sql = "SELECT * FROM users";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

JDBC是Java与数据库交互的重要工具,掌握其使用方法对于开发高效、可靠的Java应用程序至关重要。通过学习JDBC的基本概念、核心组件和使用步骤,结合具体的代码示例,可以更好地理解和应用JDBC,提升数据库编程能力。

掌握事务处理和连接池的使用可以进一步提高应用程序的性能和稳定性。在实际项目中,通常会结合ORM框架(如Hibernate)来简化数据库操作,但JDBC的基本知识仍是必备的基础技能。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/687996.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ AVL树 详细讲解

目录 一、AVL树的概念 二、AVL树的实现 1.AVL树节点的定义 2.AVL树的插入 3.AVL树的旋转 4.AVL树的验证 三、AVL树的性能 四、完结撒❀ 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查 …

SQL进阶day11——窗口函数

目录 1专用窗口函数 1.1 每类试卷得分前3名 1.2第二快/慢用时之差大于试卷时长一半的试卷 1.3连续两次作答试卷的最大时间窗 1.4近三个月未完成试卷数为0的用户完成情况 1.5未完成率较高的50%用户近三个月答卷情况 2聚合窗口函数 2.1 对试卷得分做min-max归一化 2.2每份…

m3u8视频怎么打开?教你三招!

m3u8 是一种文本文件格式,用于创建媒体播放列表,现在大部分的视频流媒体都是m3u8格式。当我们从网上下载下来m3u8文件的时候会发现,它本身不是一段视频,而是一个索引纯文本文件。想要正常打开播放m3u8视频其实也很简单&#xff0c…

解码 LangChain | LangChain + GPTCache =兼具低成本与高性能的 LLM

LangChain 联合创始人 Harrison Chase 提到,多跳问题会给语义检索带来挑战,并提出可以试用 AI 代理工具解决。不过,频繁调用 LLM 会导致出现使用成本高昂的问题。 对此,Zilliz 软件工程师 Filip Haltmayer 指出,将 GP…

塑造财务规划团队的未来角色

随着企业不断改革,其财务规划团队的格局也在不断变化,领先行业的专业人士已经开始利用更创新的财务知识和思维来驾驭现代化财务规划角色的复杂性。财务团队需要不同的职能角色和技能组合来支持其发展,多学科团队和跨职能协作带来的挑战和机遇…

C语言详解(动态内存管理)1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

MacBook Pro上高cpu上不断重启运行的efilogin-helper

高 cpu 运行这个不知道干什么的进程,让风扇疯狂输出,让人甚是烦躁,苹果社区里的回答比较抽象,要么换设备,要么重装。 尝试过找到这个文件,删了部分内容,无果。。。 stack overflow 有个回答&a…

stm32驱动直流电机实现启动/加速/减速/倒车/停车等功能

不积跬步,无以至千里;不积小流,无以成江海。 大家好,我是闲鹤,公众号 xxh_zone,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多&a…

UML交互图-协作图

概述 协作图和序列图都表示出了对象间的交互作用,但是它们侧重点不同。序列图清楚地表示了交互作用中的时间顺序,但没有明确表示对象间的关系。协作图则清楚地表示了对象间的关系,但时间顺序必须从顺序号获得。序列图常常用于表示方案&#…

使用紫铜管制作半波天线的折合振子

一、概述 半波天线是一种简单而有效的天线类型,其长度约为工作波长的一半。它具有较好的辐射特性和较高的增益,广泛应用于业余无线电、电视接收等领域。使用紫铜管制作折合振子,不仅可以提高天线的机械强度,还能增强其导电性能。 …

k8s——Pod容器中的存储方式及PV、PVC

一、Pod容器中的存储方式 需要存储方式前提:容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。 首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态&…

如何让tracert命令的显示信息显示*星号

tracert命令如果在中间某一个节点超时,只会在显示信息中标识此节点信息超时“ * * * ”,不影响整个tracert命令操作。 如上图所示,在DeviceA上执行tracert 10.1.2.2命令,缺省情况下,DeviceA上的显示信息为:…

Xamarin.Android实现通知推送功能(1)

目录 1、背景说明1.1 开发环境1.2 实现效果1.2.1 推送的界面1.2.2 推送的设置1.2.3 推送的功能实现1.2.3.1、Activity的设置【重要】1.2.3.2、代码的实现 2、源码下载3、总结4、参考资料 1、背景说明 在App开发中,通知(或消息)的推送&#x…

k8s小型实验模拟

(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。(5分) (2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPat…

Gradio 案例——将文本文件转为词云图

文章目录 Gradio 案例——将文本文件转为词云图界面截图依赖安装项目目录结构代码 Gradio 案例——将文本文件转为词云图 利用 word_cloud 库,将文本文件转为词云图更完整、丰富的示例项目见 GitHub - AlionSSS/wordcloud-webui: The web UI for word_cloud(text t…

AI产品经理岗位需求量大吗?好找工作吗?

前言 在当今这个科技日新月异的时代,人工智能(AI)已不再仅仅是一个遥远的概念,而是深深嵌入到我们生活的方方面面,从日常的语音助手到复杂的自动驾驶系统,AI的触角无处不在。随着AI技术的广泛应用和持续进…

kettle列转行(行扁平化)的使用

kettle行扁平化节点是将多行数据合并为一行数据如,其行为类似于css中的float排列 将上表格数据转换为下表格数据 namecategorynumjack语文10jack数学20jack英语40rose英语50 name语文数学英语jack102040rose50 使用行扁平化节点配置需要扁平化的字段&#xff0c…

泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心,实现与kafka对接源码及示例

文章链接:泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心,实现与kafka对接源码及示例

龙迅LT6911GX HDMI 2.1桥接到四 PORT MIPI或者LVDS,支持图像处理以及旋转,内置MCU以及LPDDR4

龙迅LT6911GX描述: LT6911GX是一款高性能的HDMI2.1到MIPI或LVDS芯片,用于VR/显示器应用。HDCP RX作为HDCP中继器的上游端,可以与其他芯片的HDCP TX协同工作,实现中继器的功能。对于HDMI2.1输入,LT6911GX可配置为3/4车…

JavaScript的核心语法

JavaScript JavaScript:JavaScript的组成:核心语法:Hello:变量:JS的基本数据类型:特殊点: 数组:流程控制语句:函数:函数的重载:函数的递归:预定义…