【Java SE】JDBC

JDBC(Java DataBase Connectivity)是一套用于在 Java 中操作关系型数据库的 API。它允许开发者使用统一的 Java 代码来访问不同的关系型数据库。

JDBC 的本质JDBC 是由官方(Sun 公司)定义的一套接口规范,各数据库厂商根据这套规范实现自己的数据库驱动程序(jar 包)。开发者通过 JDBC 编程,实际执行的操作是这些驱动程序中的实现。

JDBC 的优势:1)统一接口:各数据库厂商遵循相同接口,Java 代码无需针对不同数据库进行修改;2)灵活性:可以轻松替换底层数据库,而访问数据库的 Java 代码几乎不变。

JDBC 快速入门

这里演示如何快速上手 JDBC 的使用。

(0)创建 MySQL 数据表

MySQL 数据库中创建一个名为 dbschema,在这个 schema 中创建一个 users 表,该表用于 JDBC 的快速入门。

(1)创建工程,导入驱动 jar

利用 IDEA 创建一个新工程,Build system 选择 IntelliJ。在项目根目录下创建一个存放 jar 包的文件夹 lib。这里以 MySQL 数据库为例,将 MySQLjar 包放入 lib 中。接着,右键 jar 包选择 Add as Library...,使得当前工程能识别 jar 包。
在这里插入图片描述

(2)注册驱动

首先,在 src 下创建一个 JDBCDemo 类,用于实现 JDBC 的快速入门,在 main 函数中注册驱动:

// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");

(3)获取连接

在获取数据库连接时,需要提供数据库名称、MySQL 用户名和密码:

// 2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);

(4)定义 SQL 语句

这里以查询 users 为例:

// 3. 定义 sql
String sql = "SELECT * FROM users";

(5)获取执行 SQL 对象

使用 createStatement 获取 Statement 对象:

// 4. 获取 Statement 对象
Statement stmt = conn.createStatement();

(6)执行 SQL 语句

使用 executeQuery 执行 SQL 语句,返回 ResultSet 结果集:

// 5. 执行 SQL
ResultSet rs = stmt.executeQuery(sql);

(7)处理结果

遍历查询结果中的每一行,并读取相关字段:

// 6. 处理结果
while (rs.next()) {int id = rs.getInt("id"); // 根据列名获取数据String name = rs.getString("name");String email = rs.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}

(8)释放资源

释放该过程中使用到的资源,注意关闭资源的顺序,先开启资源后关闭:

// 7. 释放资源
rs.close();
stmt.close();
conn.close();

JDBC API 介绍

这部分主要是对 JDBC 相关的 API 进行说明。

DriverManager

驱动管理类(DriverManager)是一个工具类,其作用主要是:

(1)注册驱动

Class.forName("com.mysql.jdbc.Driver");加载 Driver 类时,该类静态代码块中使用下面的代码自动进行了驱动的注册,可以通过 Ctrl + 鼠标点击 Driver 进入代码中查看:

DriverManager.registerDriver(new Driver());

另外,在 mysql 5 之后的驱动 jar 中,可以省略 Class.forName("com.mysql.jdbc.Driver");这行代码。

(2)获取数据库连接

使用 getConnection 方法获取连接对象,其需要提供三个参数,分别是:连接路径(url)、数据库用户名(user)和数据库密码(password)。需要注意的是:

  • url 参数的语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2,示例:jdbc:mysql://127.0.0.1:3306/db

  • 如果连接的是本机 MySQL 服务器,并且 MySQL 服务默认端口是3306,则 url 可以简写为:jdbc:mysql://数据库名称?参数键值对

  • 可配置 useSSL=false 参数,禁用安全连接方式,解决警告提示。

Connection

数据库连接对象(Connection)是一个与特定数据库的连接(会话)的接口,用于执行 SQL 语句并在连接的上下文中返结果,其主要作用是:

(1)获取执行 SQL 的对象

这一部分涉及到三个方法:

  • 普通执行 SQL 对象:Statement createStatement()

  • 预编译 SQL 的执行 SQL 对象:防止 SQL 注入:PreparedStatement prepareStatement(sql)

  • 执行存储过程的对象:CallableStatement prepareCall(sql)

(2)管理事务

Connection 接口中定义了与 MySQL 3个事务对应的方法:

  • 开启事务:setAutoCommit(boolean autoCommit)

true 为自动提交事务;false为手动提交事务,即为开启事务。

  • 提交事务:commit()

  • 回滚事务:rollback()

// 定义 sql
String sql1 = "UPDATE users set name = 'a' where id = 1";
String sql2 = "UPDATE users set name = 'b' where id = 2";// 获取 Statement 对象
Statement stmt = conn.createStatement();
try {// 开启事务,确保两条sql语句执行一致conn.setAutoCommit(false);int count1 = stmt.executeUpdate(sql1); // 受影响行数System.out.println(count1);int count2 = stmt.executeUpdate(sql2); // 受影响行数System.out.println(count2);// 提交事务conn.commit();
} catch (Exception e) {// 回滚事务conn.rollback();throw new RuntimeException(e);
}

Statement

Statement 对象用于执行 SQL 语句,这个对象提供了不同的方法来执行不同的 SQL 语句。

(1)int executeUpdate(sql)执行 DMLDDL 语句

DDL 语句是对表和库的增删改操作,DML 语句是对数据的增删改操作,这个方法的返回值:

  • DML 语句影响的行数;

  • DDL 语句执行后,执行成功也可能返回 0。

// DML
String sql = "UPDATE users set name = 'a' where id = 1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
// DDL
String sql = "CREATE database db1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);

(2)ResultSet excuteQuery(sql)执行 DQL 语句

DQL 语句是对数据的查询操作,这个方法的返回值是 ResultSet 结果集对象。

// DDL
String sql = "SELECT * FROM users";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {int id = rs.getInt("id"); // 根据列名获取数据String name = rs.getString("name");String email = rs.getString("email");
}
rs.close();

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

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

相关文章

西电数据库课设|设计学籍管理系统

前言:ER图和逻辑结构图不准确,因为在后期实际建表的过程中有改动,去除了一些列和外键关系,但是我懒得返回去改图了,所以还是需要自己情况画图,还有学生信息我忘记加性别什么的,这个比较简单&…

优维HAO案例:500强旗下全牌照综合性券商CMDB平台项目

撰文:鹿小U / 制图:脾气超好 某中国500强集团旗下的HS公司,是一家具有一定行业影响力的综合性证券公司。在近年来的发展进程中,该公司坚定不移地持续推进财富管理转型工作,将 ETF 的财富管理以及机构经纪业务作为公司…

github进不去解决办法-误打误撞进去了

我的要求不高,就算麻烦,只要能进去就行,但是我找了很多的办法,xbox下载助手、watt Toolkit、更改host文件、fastgithub…最终还是没有用 绝望之际随便进了一个当时找的fastgithub连接 结果显示不是专用链接 然后看了该博主的文章…

RHCE——WEB服务器的部署及优化

URL组成 <scheme>://<user>:<password><host>:<port>/<path>:<params>?<query>#<frag> scheme 方案 访问服务器以获取资源时要使用哪种协议 user 用户 某些方案访问资源时需要的用户名 pass…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

基于SSM的毕业论文管理系统【附源码】

基于SSM的毕业论文管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统结构设计 4.2 系统顺序图设计 4.3 系统数据库设计 5 系统的实现 5.1 登录模块的实现 5.2 学生管理模块的实现 5.3 导师管理模块的实现 5.4 课题管理模块的实现 …

擎耀数字车灯CAN/LIN总线网络定向数据采集控制解决方案实施流程

2024年是数字车灯崛起的元年&#xff0c;随着车辆的智能化和网络化程度不断提高&#xff0c;车载网络系统&#xff08;如CAN总线&#xff09;成为连接各个电子控制单元&#xff08;ECU&#xff09;的重要纽带。车灯作为车辆重要的安全组件之一&#xff0c;其工作状态直接影响到…

【C++之STL】摸清 string 的模拟实现(上)

文章目录 1. 为什么要模拟实现&#xff1f;2. 基本框架搭建3. 构造函数3. 1 默认构造/from c_str3. 2 拷贝构造3. 2. 1 深浅拷贝 3. 3 fill3. 4 迭代器区间构造 4. 容量操作4. 1 size()和capacity()和empty()4. 2 clear()4. 3 resize()4. 4 reserve() 1. 为什么要模拟实现&…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

input file结合vue3和vant实现上传图片效果,并显示上传进度百分比%

这里写自定义目录标题 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码传入参数为uploadNum实现效果如图上传中&#xff0c;图片1上传成功&#xff0c;图片2 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码 传入参数为…

SELECT 语句详解

开发准备 注:如果你是从上一节直接进入本节进行学习的,请先删除上一节建立的数据库mysql_shiyan,删除语句为DROP DATABASE mysql_shiyan;。在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,projec…

重力传感器算法概述!

一、核心技术 高精度重力测量技术&#xff1a; 无人机重力传感器的核心技术之一是能够高精度地测量重力加速度数据。这通常依赖于先进的传感器设计和制造工艺&#xff0c;以确保传感器具有高度的灵敏度和稳定性。 例如&#xff0c;中国船舶第七〇七研究所自主研发的低空重力…

炼码LintCode--数据库题库(级别:中等;数量:更新中~)--刷题笔记_03

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;中等&#xff1b;数量&#xff1a;更新中~&#xff09;--刷题笔记_033617 更换连续两个人的座位&#xff08;case when&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a; 3615 数据中位数&#xff08;窗…

【stm入门学习SPI_铁头山羊系列教程】

stm入门学习SPI_铁头山羊教程 1.SPI总线1.电路结构与通信协议2.SPI的特点&#xff1a;3. 极性 相位4. 4中时钟模式5. 比特位的传输模式6.数据宽度 2. SPI引脚IO引脚初始化 1.SPI总线 1.电路结构与通信协议 主机向从机NSS引脚发送低电压&#xff0c;选中该从机。 主机通过向MOS…

RK3568平台开发系列讲解(platform虚拟总线驱动篇)实验:点亮一个LED

🚀返回专栏总目录 文章目录 一、设备树二、平台驱动三、应用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢xxx 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性,编写测试应用程序。 • 首先向设备树添加 LED 设备节点…

Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言 在现代的分布式系统和微服务架构中&#xff0c;数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog&#xff08;二进制日志&#xff09;功能能够记录所有对数据库的修改操作&#xff0c;如插入&#xff08;INSERT&#xff09;、更新&…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

算法——链表相交(leetcode23)

链表相交这题就是找出两个相交链表相交的节点并返回 如上图假设上方第一个节点是链表A的头结点下方第一个节点是链表B的头结点 解法有以下两种 方法一(移动长链表指针后同步移动两个链表的指针直至相等) 也就是先遍历链表A和链表B的长度接着得到链表A和B长度的差值然后领长链…

STM32单片机锁死

自己画了一块stm32f407板子&#xff0c;外部晶振用了25MHz&#xff0c;烧写了8MHz的程序&#xff0c;第一次烧写成功&#xff0c;第二次开始识别不到芯片&#xff0c;第一次烧写成功由于外部晶振为25Hz&#xff0c;芯片内频率计算器却是按照8MHz写的&#xff0c;所以得出最后的…