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

news2024/11/25 8:46:03
一、简介

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的基本知识仍是必备的基础技能。

黑马程序员免费预约咨询

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红酒保存中的软木塞与瓶身保护

云仓酒庄雷盛红酒,以其卓着的品质和精美的包装赢得了众多消费者的喜爱。在红酒的保存过程中,软木塞与瓶身保护是至关重要的环节。本文将深入探讨这两方面的问题,以帮助消费者更好地理解和欣赏云仓酒庄雷盛红酒。 首先,我们来谈谈软…

关于调用百度AI开放平台短文本在线合成API接口 Open api characters limit reached 问题

官方示例代码中心: https://console.bce.baidu.com/support/?_1668482508529#/api?productAI&project语音技术&parent语音合成&apitext2audio&methodpost 一、调试时,若提示 16: Open api characters limit reached({"…

《维汉翻译通》App全新升级:维吾尔语短文本翻译、汉语拼音标注、维语词典、谚语格言名句等功能统统免费!还支持维吾尔文OCR识别提取文字!

2024年《维汉翻译通》App迎来重大更新!这次升级不仅带来了全新的功能,还为所有用户提供了更加便捷的服务体验。以下是我们新版本的主要亮点: 维语短文本翻译免费啦! 我们深知语言是沟通的桥梁,为了让更多人能够跨越语…

Python 短文本匹配,短文本语义相似度,基于大模型的短文本匹配,基于LLMs的短文本语义相似度识别,短文本语义扩充和匹配

1.任务描述 之前在做疾病相似度匹配的时候,堪称史诗级难题,虽然最后加上规则以及一些nlp模型,取得了差强人意的效果,但是短文本的语义相似度匹配一直属于比较难以攻克的难题 2.思路 随着近年大模型的飞速发展,就之前…

七天进阶elasticsearch[two]

批量保存 批量保存是通过_bulk API来实现的 请求方式 post 请求地址 _bulk 通过_bulk操作文档,一般至少有两行参数 第一行用于确定要干什么(插入,修改还是删除) 第二行才是操作的数据; 当然以上是标准操作,也可以不遵循标准操作,使用不同的请求方式来完成 批量保存demo…

基于 MediaPipe 的 2D 和 3D 的人体姿态追踪:Rerun 展示

点击下方卡片,关注“小白玩转Python”公众号 概述 我们探讨一个使用 MediaPipe 在 2D 和 3D 中追踪人体姿态的用例。使这次探索更加有趣的是通过开源可视化工具 Rerun 提供的可视化功能,可以全方位展示人体姿态的动态。在这篇博文中,您将学习…

知识图谱的应用---智慧政务

文章目录 智慧政务典型应用 智慧政务 智慧政务即通过“互联网政务服务”构建智慧型政府,利用云计算、移动物联网、人工智能、数据挖掘、知识管理等技术,提高政府在办公、监管、服务、决策中的智能水平,形成高效、敏捷、公开、便民的新型政府&…

静态IP地址:多元化场景下的稳定连接解决方案

当考虑静态IP地址的适用场景时,我们可以从以下几个板块进行细分和归纳: 一、服务器托管与网络服务 1. 服务器托管 稳定性:静态IP确保服务器能够持续、稳定地接入互联网,减少因IP地址更新带来的服务中断风险。 可访问性&am…

java:reactor的Mono和Reactor的简单例子

【pom.xml】 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.3.17.RELEASE</version> </dependency>【MyReactorTest2.java】 package com.chz.myReactor;import react…

基于 Delphi 的前后端分离:之三,使用 HTMX

# 前请提要 基于 Delphi 的前后端分离&#xff1a;之一_delphi 后台vue-CSDN博客 基于 Delphi 的前后端分离&#xff1a;之二_后端 框架 delphi-CSDN博客 # 发现一个非常好的前端框架 - HTMX 这里仍然使用之二里面提到的页面模板&#xff0c;但采用 HTMX 来和后端交互&#…

Redis持久化说明

Redis的持久化是指将内存中的数据持久化到磁盘中&#xff0c;以保证数据在重启或宕机后不会丢失。 Redis提供了两种主要的持久化方式&#xff1a;RDB(Redis DataBase)和AOF(Append Only File)。 RDB&#xff08;Redis DataBase&#xff09; 1、RDB快照原理 RDB持久化方式会定…

Django分页

1、在视图函数文件中引入‘分页器’ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 2、给原来的罗列信息函数&#xff0c;添加分页功能&#xff0c;即按照页码&#xff0c;只返回部分信息。 login_required def article_list(request):article…

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

ICLR2024佳作:多视图Transformer再次升级,直接感知三维几何信息

论文标题&#xff1a; GTA: A Geometry-Aware Attention Mechanism for Multi-View Transformers 论文作者&#xff1a; Takeru Miyato, Bernhard Jaeger, Max Welling, Andreas Geiger 导读&#xff1a; 本文提出一种几何感知注意力机制&#xff0c;替换Transformer中原有的…

用TuneFab下载Apple Music

Apple Music以出色的高保真音质流式传输歌曲已不是什么秘密&#xff0c;但用iTunes下载的离线音乐&#xff0c;采用了Apple的DRM&#xff08;数字版权管理&#xff09;技术&#xff0c;并不能在其他应用上播放&#xff0c;通过TuneFab软件&#xff0c;可以截获iTunes播放流&…

【vue3|第7期】 toRefs 与 toRef 的深入剖析

日期&#xff1a;2024年6月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

FISCO BCOS助力郑州数据交易中心“碳账户”小程序上线

近年来&#xff0c;科技和数字化成为推进可持续绿色发展的关键词。在第53个世界环境日来临之际&#xff0c;由FISCO BCOS支持建设的郑州数据交易中心双碳数据服务专区迎来了新进展&#xff01;近日&#xff0c;专区正式以"碳账户"小程序对外提供多种形式的碳数据服务…

我国衡器市场规模逐渐扩大 出口量远大于进口量

我国衡器市场规模逐渐扩大 出口量远大于进口量 衡器是利用力的杠杆平衡原理或胡克定律来测定物体质量的一种仪器设备。随着生产技术逐渐进步&#xff0c;衡器的种类逐渐增多。根据衡量方法不同&#xff0c;衡器大致可分为非自动衡器、自动衡器等&#xff1b;根据结构原理不同&a…

RE_TEA加密

TEA这段时间遇到的是真多&#xff0c;有直接原始加密&#xff0c;也有 XTEA&#xff0c;XXTEA&#xff0c;更有在此上魔改的&#xff0c;之前也是能认出来&#xff0c;知道还是不够。 en,TEA加密解密脚本还是用 C 好一些&#xff0c;什么溢出之类不用考虑。 TEA 也有可能是 …

JimuReport 积木报表 v1.7.5 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…