JDBC 编程

news2025/4/17 2:21:27

目录

JDBC 是什么

JDBC 的工作原理

JDBC 的使用

引入驱动

使用

常用接口和类

Connection

Statement

ResultSet

使用总结


JDBC 是什么

JDBC(Java Database Connectivity):Java数据库连接,是一种用于执行 SQL 语句的Java API,是 Java 数据库连接规范,为 Java 开发人员操作数据库提供了一个标准的 API,可以为多种关系数据库提供统一访问

数据库是一个类别,其中包括 MySQL、Oracle、sql server 等,这些数据库提供的 API 有所不同,也就增加了我们的学习成本

而 JDBC 为实现数据库操作提供了一套标准接口,让 Java 应用程序能够与各种数据库系统交互,而不需要关键具体数据库的实现细节

JDBC 的工作原理

JDBC 为多种关系数据库提供了统一访问方式,主要包含一些通用的接口类

JDBC 访问数据库的层次结构

JDBC的优势:

Java语言操作数据库时完全面向抽象接口编程

开发数据库应用不用限定特定数据库厂商的API

程序的可移植性大大增强

JDBC 的使用

引入驱动

在使用 JDBC 之前,需要引入 JDBC 驱动包

在仓库中进行下载:

Maven Repository: Search/Browse/Explore (mvnrepository.com)

搜索mysql:

 其中:

Connector/J 中存放的是更高版本的驱动包

Connector Java 中存放的是低版本的驱动包

根据服务器的版本选择对应驱动包:

选择对应版本的驱动包,并下载:

接着,我们将 jar 包引入到项目中

我们先创建一个新项目,并创建一个目录,并将 jar 包拷贝到这个目录中:

再右键这个新目录,add as library: 

接下来,我们就可以编写代码了

使用

首先,需要创建数据源(数据源描述了需要操作的数据库在哪里),设置数据库连接的 url、用户名 和 密码:

DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");

其中,MySQL 数据连接的 url 参数格式为:

jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

charsetEncoding:设置字符集和编码方式

useSSL:数据是否进行加密传输

接着,和数据库服务器建立连接:

Connection connection = dataSource.getConnection();

在建立连接的过程中可能会出错(抛出异常),如 url 不正确、用户名有误、密码错误等,需要我们进行处理

然后,就可以构造 SQL 语句并执行了

        // 构造 SQL
        String sql = "insert into class values (4, '四班')";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 执行 SQL
        int result = statement.executeUpdate();
        // 查看执行结果
        System.out.println(result);

最后,别忘记释放资源

statement.close();
connection.close();

上述完整代码:

public class Test {
    public static void main(String[] args) throws SQLException {
        // 构造 DataSourse
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 建立连接
        Connection connection = dataSource.getConnection();

        // 构造 SQL
        String sql = "insert into class values (4, '四班')";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 执行 SQL
        int result = statement.executeUpdate();
        // 查看执行结果
        System.out.println(result);

        // 执行完毕,释放资源
        statement.close();
        connection.close();
    }
}

总结一下 JDBC 的使用步骤:

1. 创建数据库连接 Connection

2. 创建操作命令

3. 执行SQL

4. 若进行查询操作,处理结果集 ResultSet

5. 释放资源

在通过 JDBC 对数据库进行操作时,需要使用其提供的 API 进行统一处理,因此,我们来进一步学习 JDBC API 

常用接口和类

Connection

Connection 接口用于与数据库建立连接,由数据库提供,获取 Connection 对象通常有两种方式:

(1)通过 DriverManager(驱动管理类)的静态方法获取

// 数据库连接信息
String url = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false";
String user = "root";
String password = "123456";
// 加载 JDBC 驱动
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url, user, password);

(2)通过 DataSource(数据源)对象获取

// 构造 DataSourse
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("phantom5170&");
// 建立连接
Connection connection = dataSource.getConnection();

上述两种方式的区别为:

使用 DriverManager 类获取的 Connection 连接,是无法重复利用的,每次使用完后释放资源时,通过 connection.close() 关闭物理连接

DataSource 提供连接池支持,连接池在初始化创建时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用 connection.close() 都是将 Connection 连接对象回收

Statement

Statement 对象主要是将 SQL 语句发送到数据库中,JDBC API 中主要提供了三种 Statement 对象

Statement:通常用于执行不带参数的简单 SQL 语句

PreparedStatement:用于执行带或不带参数的SQL语句,SQL 语句会进行预编译,PreparedStatement 的执行速度快于 Statement

CallableStatement:用于执行数据库存储过程中的调用

其中,PreparedStatement 是最常用的,接下来,我们就来继续学习 PreparedStatement

什么是预编译?

当数据库服务器收到一条SQL语句之后,会:

先解析语法和语义,校验 SQL 语句是否正确

再优化 SQL 制定执行计划

执行并返回结果

 若一条 SQL 执行上述流程,就称为  Immediate Statements(即时SQL)

而 预编译 SQL 则会在编译一次之后将 SQL 语句缓存起来,后面再执行这条语句时,就不会再进行编译,省去了解析优化等过程

预编译 SQL 可以提高执行效率,因为 SQL 语句只需编译一次,然后可以多次执行,避免了重复编译的开销。预编译 SQL 通常用于需要频繁执行的 SQL 语句,如重复执行的查询或更新操作

即:

Immediate Statements(即时SQL):每次执行 SQL 语句时,数据库管理系统都会即时地进行语法分析、语义分析、优化和执行,而不是提前进行编译和优化。每次执行即时 SQL 语句都会有一定的性能开销,因为需要进行完整的编译和优化过程。

预编译 SQL(Prepared SQL):在预编译阶段,数据库管理系统(DBMS)会对 SQL 语句进行编译,生成执行计划,并将其存储在数据库中,而不是在每次执行时重新编译。在执行阶段,应用程序发送带有占位符的预编译 SQL 语句给 DBMS,DBMS 根据预编译的执行计划执行 SQL,并将实际参数传递给占位符,以生成最终的查询结果

 如何向 SQL 语句传递参数?

通常使用 字符串 来构造 SQL 语句,如 String sql = "insert into class values (4, '四班')" 此时语句中的参数是固定的,但是若我们需要让用户来指定参数,此时,该如何传递参数呢?

PreparedStatement 可以使用 ? 作为占位符,后续再进行参数的指定:

// 构造 SQL
String sql = "insert into class values (?, ?)";
// 将 string sql 转换为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
// 获取输入的参数
Scanner scanner = new Scanner(System.in);
System.out.print("请输入班级id:>");
int classId = scanner.nextInt();
System.out.print("请输入班级名称:>");
String className = scanner.next();
// 设置 sql 参数
statement.setInt(1, classId);
statement.setString(2, className);

先使用 ? 对要进行传递的参数进行占位,后续再设置参数的值

paramenterIndex:参数下标

x:参数的值

PreparedStatement 中主要使用以下两种执行SQL的方法:

executeQuery():通常用于执行 select 语句,执行后返回一个结果集(ResultSet)

executeUpdate():通常用于执行 update、insert delete 语句,返回受影响的行数

我们对执行上述构造的 sql:

// 执行 SQL
int result = statement.executeUpdate();
// 查看执行结果
System.out.println(result);

返回结果为1,表示执行的语句影响了一行,说明插入操作成功

ResultSet

ResultSet(结果集) 对象表示符合 SQL 语句的所有行

我们进行查询操作:

String selectSql = "select * from employees";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();

ResultSet 中的数据是一行一行排列的,每行有多个字段,有一个记录指针,指针所指的数据行为当前数据行

我们只能操作当前的数据行,若我们想要获取某一行,就需要使用 ResultSet 的 next() 方法找到这一行,若我们想要得到 ResultSet 中的所有记录,就需要使用 while 循环

while (resultSet.next()) {

}

通过其提供的 get 方法来对行中的数据进行访问:

例如: 

        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int managerId = resultSet.getInt("manager_id");
            System.out.println("id: " + id + " name: " + name + " manager_id: " + managerId);
        }

注意:结果集也需要释放

为了保证资源能够释放,我们可以将它们放到 finally

public class Test {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            // 构造 DataSourse
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource) dataSource).setUser("root");
            ((MysqlDataSource) dataSource).setPassword("phantom5170&");
            // 建立连接
            connection = dataSource.getConnection();
            // 构造 sql
            String sql = "select * from employees";
            statement = connection.prepareStatement(sql);
            resultSet = statement.executeQuery();
            // 查看结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int managerId = resultSet.getInt("manager_id");
                System.out.println("id: " + id + " name: " + name + " manager_id: " + managerId);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 执行完毕,释放资源
            if(resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

使用总结

JDBC 使用步骤:

1. 创建数据库连接Connection

DriverManager 创建

DataSource 获取

2. 创建操作命令Statement

Statement

PreparedStatement

CallableStatement

3. 使用操作命令来执行SQL

executeQuery()

executeUpdate() 

4. 处理结果集 Result

while (resultSet.next()) {

        int id = resultSet.getInt("id");

        String name = resultSet.getString("name");

        ...

5. 释放资源 

 // 执行完毕,释放资源
            if(resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

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

相关文章

【附激活码】2024最新PyCharm下载安装激活汉化教程!

一、PyCharm激活 激活码: KQ8KMJ77TY-eyJsaWNlbnNlSWQiOiJLUThLTUo3N1RZIiwibGljZW5zZWVOYW1lIjoiVW5pdmVyc2l0YXMgTmVnZXJpIE1hbGFuZyIsImxpY2Vuc2VlVHlwZSI6IkNMQVNTUk9PTSIsImFzc2lnbmVlTmFtZSI6IkpldOWFqOWutuahtiDorqTlh4blupflkI0iLCJhc3NpZ25lZUVtYWlsIjoi…

如何使用 Python Matplotlib 绘制 3D 曲面图

在数据可视化中,3D 图表是一个非常有用的工具,特别是当想要展示复杂的三维数据时,如期权的波动率曲面。Python 的 matplotlib 库提供了生成各种类型图表,包括 3D 图表。 本文将介绍如何使用 Python 中的 matplotlib 绘制 3D 曲面…

分公司=一部门——组合模式

文章目录 分公司一部门——组合模式分公司不就是一部门吗?组合模式透明方式与安全方式何时使用组合模式公司管理系统组合模式好处 分公司一部门——组合模式 分公司不就是一部门吗? 时间:5月10日19点  地点:小菜、大鸟住所的客…

开放的数据时代:Web3和个人隐私的未来

在数字化和信息化的时代,数据隐私成为了公众关注的焦点。随着Web3技术的兴起,个人隐私保护进入了一个新的阶段。Web3作为去中心化的互联网架构,提出了对数据控制和隐私保护的新方案。本文将探讨Web3如何影响个人隐私的未来,并分析…

[附源码]SpringBoot+VUE+Java实现人脸识别系统

今天带来一款优秀的项目:java人脸识别系统源码 。 系统采用的流行的前后端分离结构,内含功能包括 “人脸数数据录入”,“人脸管理”,“摄像头识别” 如果您有任何问题,也请联系小编,小编是经验丰富的程序员…

编写程序,在一行上显示1-5数字,每个相邻的数字要求用空格进行分开

目录 前言 一、一行输出(使用一个System语句输出) 二、多行输出(使用多(N)个System语句输出) 三、循环输出(使用for语句循环在通过System语句输出) 四、完整代码 前言 1.本文所…

只会Python编程,做量化交易策略用QMT怎么样?听说QMT是支持Python的!

QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端,拥有高速行情、极速交易、策略交易、多维度风控等专业功能,满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…

使用 UWA Gears 定位游戏内存问题

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台,提供了实时监测和截帧分析功能,帮助您精准定位性能热点,提升应用的整体表现。 内存不足、内存泄漏和过度使用等问题,常常导致游戏出现卡顿、崩溃,甚至影响…

偷偷告诉你,学会使用这几样测试用例管理工具就够啦!

在软件开发过程中,测试是必不可少的一环,而测试用例则是测试的重要依据。如何有效地管理测试用例,提高测试效率,是每一个测试人员都需要面对的问题。本文将为你介绍几款实用的测试用例管理工具,帮助你更好地进行测试工…

2024年双十一不容错过的好物分享,最值得买的五款单品

双十一购物狂欢节将至,这是一场属于“剁手党”的年度盛宴。每年的11月11日,各大电商平台纷纷推出海量优惠活动,吸引无数消费者积极参与。对于热衷于寻找好物的人来说,双十一无疑是一个不容错过的机会,双十一好物不间断…

基于JavaWeb开发的java+Springboot操作系统教学交流平台详细设计实现

基于JavaWeb开发的javaSpringboot操作系统教学交流平台详细设计实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接…

零基础制作一个ST-LINK V2 附PCB文件原理图 AD格式

资料下载地址:零基础制作一个ST-LINK V2 附PCB文件原理图 AD格式 ST-LINK/V2是一款可以在线仿真以及下载STM8以及STM32的开发工具。支持所有带SWIM接口的STM8系列单片机;支持所有带JTAG / SWD接口的STM32系列单片机。 基本属性 ST-LINK/V2是ST意法半导体为评估、开…

【我的 PWN 学习手札】劫持 tcache_perthread_struct

目录 前言 一、tcache perthread struct 二、劫持 tcache_perthread_struct 三、测试与模板 前言 tcache 是 glibc 2.26 (ubuntu 17.10) 之后引入的一种技术,目的是提升堆管理的性能,与 fast bin 类似。 tcache 引入了两个新的结构体, tc…

idear导入他人项目如何快速运行

最近idear经常导入别人的项目,结果永远在加载依赖项。网上查了一堆资料,什么jdk问题,环境变量问题,maven仓库路径问题,总之就是没啥用。那有没有什么简单粗暴的办法,能够导入项目后快速运行呢。 解决方法&a…

独立站技能树之建站33项自检清单 1.0丨出海笔记

很多时候大家建好站之后很嗨,但过一会就开始担忧各种纠结我是不是还有什么点没做好,或者我的站漏了什么东西,那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板,因为模板上面基本该有的…

Gitee丝滑版本:成功在新电脑添加新文件

git 关键步骤 1.首先在新电脑建一个文件夹,然后打开这个文件夹里面右键打开OPEN BASH GIT HERE。 2.然后输入git init,会在文件夹生成一个git.文件,接着把复制的get clone命令克隆过去就可以下载了,如果遇到403问题&#xff0c…

【机器学习】从数据到决策——完整的机器学习项目实战解析

【机器学习】从数据到决策——完整的机器学习项目实战解析 1. 引言 机器学习项目不仅仅是训练一个模型,它涉及从数据预处理到模型评估的完整流程。本文将通过一个完整的机器学习项目,展示从数据准备到最终决策的关键步骤。这将帮助你理解如何系统地构建…

9-----MTK专用工具 MTKpro解锁 读取分区 备份nv 檫除nv 工具预览与步骤解析

以上工具包含原版与汉化版工具。根据上面图示 可以看到此工具可以刷写mtk机型,包含有刷机的各个加载选项以及刷写方式。其中动画界面演示了无需加载任何引导。联机就可以读取到当前机型分区的演示。 工具功能选项 ★★★★★不需要任何引导直接读取mtk分区 备份 檫除 写入分…

shinyproxy部署R语言shiny APP

shinyproxy部署shiny APP经验谈 shinyAPP 是成熟的web APP框架,依靠R语言的数据分析功能可以构建功能丰富的,外表美观的web APP,但是APP部署是shiny APP最大的瓶颈,免费部署途径有诸多的限制,收费的部署方式价格昂贵。…

解析碳化硅MOSFET B2M030120Z的卓越性能与应用前景

碳化硅MOSFET具有优秀的高频、高压、高温性能,是目前电力电子领域最受关注的宽禁带功率半导体器件。在电力电子系统中应用碳化硅MOSFET器件替代传统硅IGBT器件,可提高功率回路开关频率,提升系统效率及功率密度,降低系统综合成本。…