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

JDBC编程

前言:

你是否见过用Java连接数据库的操作,对没错,今天我们要讲的就是这个“高级”操作,做好准备全程高速。

API:

什么是API?我喜欢先把它的全称说一下:Application Programming Interface。简称 API 函数。

Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API 也就是 Microsoft Windows 32 位平台的应用程序编程接口。

说人话就是函数,我们能直接使用(应该就是使用Windows系统都可以使用这些函数)。

因为我们用的是Java,所以要是用这些方法需要导入包,才能使用这些方法。

JDBC:

在此之前我么先说一下什么是JDBC:JDBC是Java Database Connectivity的缩写,是一种用于Java程序访问关系型数据库的API。它允许Java程序员使用标准的SQL语句来访问和操作数据库。JDBC提供了一种标准的方式来连接到不同数据库的驱动程序,并且是Java EE平台上进行数据访问的基础。它提供了许多接口和类,使Java应用程序可以通过他们来访问和管理关系型数据库。

JDBC的好处:

API既然叫做程序应用接口,这里面的程序你可以理解为软件,因为操作系统也是软件。那么也就说明每个软件可能都有不同的API。我们刚才又说了,API可以理解为函数,既然不同软件可能有不同的API,那么说明他们的方法可能都不一样。

比如你平时用的API是MySQL的,此时你领导让你使用oracle的API,此时你就傻眼了,因为你几乎不可能同时记得两种相同作用但不相同名字的API。

这时候,Java就站出来了,像秦始皇一样进行了车同轨,书同文一样,它让所有的API都进行了统一。 也就是JDBC,它统一了Java程序访问关系型数据库的API。

通过JDBC,开发人员可以使用标准的SQL雨具来操作数据库。

JDBC写操作:

1、准备工作:

要想在程序中操作MySQL,就需要先安装MySQL的驱动包。

这里我们给出官方链接:https://mvnrepository.com/search?q=MySQL

当然我们要根据当前版本(MySQL版本)进行选择下载那个驱动包,如果MySQL是5,驱动包也要使用5系列。

至于如何得知自己的MySQL版本,当我们登录MySQL时输入密码,里面会显示;也可以输入select version(); 来查看。

.jar 是Java中常见的后缀类型,Java写的程序会有很多.class文件,当我们要发文件给别人时,我们就会把这些文件打包成.jar包发给别人。

jar如何引入到项目中? 

先把jar复制到当前项目目录中

之后创建Java项目之后: 

之后要把这个目录标记成库:

此时准备工作完成,就可以编写代码了。记住,每次创建项目,都需要把这个jar包导入,javax.sql 就是JDBC的包。

2、创建DataSource

在此之前,我们先介绍一下什么是耦合和内聚:

内聚:把相同的功能放在一起

耦合:两个模块之间关联关系不是非常密切,也就是这边变换会影响到另一边。

所以我们写代码要追求高内聚,低耦合

这里我们要建立DataSource,还需要一个前置知识,就是什么是url。

url 表示网络上的资源位置,MySQL是一个客户端服务器结构的程序,通过网络进行交互的。说人话也就是:url也可以称作网址。 

我们来图解一个url:

哎~先不要着急,这里有可能不是完整的url,可能到你的电脑上运行不了(因为我的就是,这里需要在添加一个地区),我在上海,所以要完整语句为:

jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

 这个错误是由于 MySQL 服务器的时区设置不被识别或表示多个时区。你需要在连接 URL 中指定 serverTimezone 参数来解决这个问题。因为这可能导致你所在的地区和应用程序所期望的时区不一致,所以谨慎处理,可以加上。

?后面,表示访问资源的时候,需要哪些参数。这里我们举一个例子更好的理解:

开店://上海电机学院1食堂:3楼/烧饼?豆腐串=要&鸡蛋=要

所以此时我们此时完整语句为:

// 1.先创建 DataSource 也就是数据源头
DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");

但是DataSource只写url只是找到了MySQL服务器,还得认证(用户名、密码):

((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");

root是管理员,MySQL默认自带的用户。

此时只是准备工作,还没有实现与MySQL通信。

3、 和数据库建立连接

这里没什么好说的:

// 2.建立和数据库服务器之间的连接 连接之后才能进行后续的 请求-响应 交互
Connection connection = dataSource.getConnection();

这个是JDBC中的异常,如果执行sql或者操作数据库过程中出现问题,一般会抛出这个异常。

4、构造SQL(增、删、改)

//3.构造 sql 注意:代码中的 sql 不需要写 ;
String sql = "insert into student values(1, '张三')";
PreparedStatement statement = connection.prepareStatement(sql);

构造sql (代码中的sql不需要写语句末尾的";"。

当然我们可以自己写入id和姓名:

Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生学号:");
int id = scanner.nextInt();
System.out.println("请输入学生姓名:");
String name = scanner.next();

之后这样编写SQL语句:

String sql = "insert into student values(" + id + ",'" + name + "'" + ")";

但是各位感觉这样写怎么样?是不是很傻很复杂?确实,而且很不安全,举个栗子:

此时就可以攻击数据库,所以提供了另一种写法:

//3.构造 sql 注意:代码中的 sql 不需要写 ;
String sql = "insert into student values(?, ?)";
//引入 '?' 做占位符
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);

里面的数字是替换第几个"?",这里是从第一个开始,不是从0开始。 

5、把SQL发给服务器

因为数据库我们平时操作的时候会返回两种结果,一种是影响的行数,一种是查询的结果,所以有两种方法:

此时我们是写操作: 

//4.把 sql 发送给服务器 返回值是一个整数,表示影响到的行数
int n = statement.executeUpdate();
System.out.println("影响的行数:" + n);

注意这个方法返回的是一个整数,所以我们可以打印一下。

6、关闭资源 

//5.关闭资源,释放资源  释放顺序 后获取的资源先释放
statement.close();
connection.close();

释放顺序为:后获得的资源先释放。 

7、写操作整体效果:

此时我们先给出整体代码,之后从数据库中管材结果:

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.ConnectionEvent;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;// 通过这个代码 往数据库中插入一条记录public class Dome {public static void main(String[] args) throws SQLException {Scanner scanner = new Scanner(System.in);System.out.println("请输入学生学号:");int id = scanner.nextInt();System.out.println("请输入学生姓名:");String name = scanner.next();//1.先创建 DataSource 也就是数据源头DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");//2.建立和数据库服务器之间的连接 连接之后才能进行后续的 请求-响应 交互Connection connection = dataSource.getConnection();//3.构造 sql 注意:代码中的 sql 不需要写 ;String sql = "insert into student values(?, ?)";//引入 '?' 做占位符PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, id);statement.setString(2, name);//4.把 sql 发送给服务器 返回值是一个整数,表示影响到的行数int n = statement.executeUpdate();System.out.println("影响的行数:" + n);//5.关闭资源,释放资源  释放顺序 后获取的资源先释放statement.close();connection.close();}
}

此时我们执行代码,并输入学号为6,姓名为李四的学生并在MySQL中查看:

JDBC读操作:

这个单独介绍一下,其实区别也不大。

为了更好的理解,我们再创建一个类,除了SQL语句不一样和把SQL发给服务器不一样,其他都是一样的流程。这里我们只介绍区别:

String sql = "select * from   student";
PreparedStatement statement = connection.prepareStatement(sql);// 遍历结果集合
// 通过 next 方法可以获取每一行数据 最后一行再执行返回 false
while(resultSet.next()) {// 这对这一行输出int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = " + id + ", name = " + name);
}

这里遍历类似于迭代器,但是略有差异。hasNext方法初始情况写指向第一个元素,但是这个next方法初始指向第一个元素前一个位置。

hasNext是判断有没有下一个,里面还需要调用next方法移动光标。

完整代码:

// jdbc 查询import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class Demo2 {public static void main(String[] args) throws SQLException {// 1.创建 DataSourceDataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");// 2.建立连接Connection connection = dataSource.getConnection();// 3.构造sqlString sql = "select * from   student";PreparedStatement statement = connection.prepareStatement(sql);// 4.执行sql// ResultSet 就表示查询的结果集合(集合表)ResultSet resultSet = statement.executeQuery(); //返回的是 ResultSet(结果集合)// 5.遍历结果集合// 通过 next 方法可以获取每一行数据 最后一行再执行返回 falsewhile(resultSet.next()) {// 这对这一行输出int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = " + id + ", name = " + name);}// 6.释放资源resultSet.close();statement.close();connection.close();}
}

运行结果:

读操作就是多了一个遍历结果集的过程。

总结:

这里我们可以发现,其实我们之前学习的SQL语句都是很重要的。

你可能会有点反应不过来,这里面这么多类和方法,但实际就是这样,我们没有必要去学习所有的知识的原理,尤其是这些东西,而且真的很难记住,我们只需要大致学会使用,使用的时候去查看也是无可厚非的。

但是JDBC的API还是太过复杂,我们以后可能会学习其他更好的框架进行使用,但是毕竟这是元老级别,我们必须了解并且掌握使用。 

相关文章:

JDBC编程

前言: 你是否见过用Java连接数据库的操作,对没错,今天我们要讲的就是这个“高级”操作,做好准备全程高速。 API: 什么是API?我喜欢先把它的全称说一下:Application Programming Interface。简…...

Python : 类变量、静态方法、类方法

文章目录 前言1 类变量(Java静态变量)2 Python中的静态方法(使用 @staticmethod 装饰器声明)3 类方法(使用 @classmethod 装饰器声明)4 静态方法和类方法的区别前言 学完Java过后,对python中有了一些疑惑。Java中有static修饰的静态变量和静态方法这两个很用用的知识点…...

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗? 这个罪恶的源头就是 Google,说是为了选择高素质的计算机编程水平的人才,然后把面试就变成了考试,最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…...

【PostgreSQL】入门篇——如何创建、删除和管理数据库及其用户,包括权限设置和角色管理

PostgreSQL 数据库及用户管理 1. 创建数据库 1.1 使用 SQL 命令创建数据库 在 PostgreSQL 中,可以使用 CREATE DATABASE 命令来创建数据库。以下是基本语法: CREATE DATABASE database_name;示例: CREATE DATABASE my_database;1.2 使用…...

网络安全:保护数字时代的堡垒

网络安全:保护数字时代的堡垒 引言: 在数字化时代,网络安全的重要性日益凸显。它不仅关系到个人隐私保护,还涉及国家安全和经济发展。随着技术的发展,网络安全的威胁也在不断进化,从个人设备到企业网络&am…...

【rCore OS 开源操作系统】Rust 字符串(可变字符串String与字符串切片str)

【rCore OS 开源操作系统】Rust 语法详解: Strings 前言 这次涉及到的题目相对来说比较有深度,涉及到 Rust 新手们容易困惑的点。 这一次在直接开始做题之前,先来学习下字符串相关的知识。 Rust 的字符串 Rust中“字符串”这个概念涉及多种类型&…...

远程过程调用RPC知识科普

文章目录 什么是RPCRPC的基本原理RPC的应用场景RPC的优势常见的RPC框架 常见的RPC协议1. gRPC2. Apache Thrift3. Dubbo4. JSON-RPC5. XML-RPC6. SOAP springboot环境下常用的RPC框架使用1. Apache Dubbo2. Apache Thrift3. gRPC4. Spring Cloud OpenFeign 什么是RPC RPC&…...

Java - LeetCode面试经典150题 - 区间 (三)

区间 228. 汇总区间 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…...

NVIDIA网卡系列之ConnectX-6 DX规格信息(200G-PCIe 4.0x16-8PF1000VF-2019年发布)

背景 NVIDIA ConnectX-6是最大支持200G的产品,有DX LX等系列。LX一般是25G比较便宜。 核心关键点 200GbpsPCIe 4.0,最大lane: x16 (4.0的lane速 16GT/s * 16 256T/s,所以支持的是200G的网卡用PCIe4.0)QSFPPF,VF数量&#xff1…...

【案例】平面云

教程案例视频:Unity Shader Graph - 云教程 开发平台:Unity 2022 开发工具:Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路:使用 Noise(噪声)模拟云层状态   3.1 说明…...

测试用例的进阶二

1. 按开发阶段划分 1.1 测试金字塔 从上到下,对于测试人员代码就是要求越来越低; 从下到上,越来越靠近用户; 从下到上,定位问题的成本越来越高; 1.2 单元测试(Unit Testing) 单元测试是对软件组成单元进…...

zotero WebDAV同步忘记密码

https://www.jianguoyun.com/#/safety 找到应用密码...

如何在 SQL 中创建一个新的数据库?

在SQL中创建一个新的数据库,首先你需要有一个可以执行SQL语句的环境。 这通常意味着你已经有了一个数据库管理系统(DBMS),如MySQL、PostgreSQL、Oracle或Microsoft SQL Server等。 不同的DBMS可能有不同的细节,但基本…...

《Linux从小白到高手》理论篇:Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识,并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序,一个运行着的程序,可能有多个进程。 比如Oracle DB,启动Oracle实例服务后,就会有多个进程。 Linux进程分类 在 Linux…...

【Qt】控件概述(3)—— 显示类控件

显示类控件 1. QLabel——标签1.1 setPixmap设置图片1.2 setAlignment设置文本对齐方式1.3 setWordWrap设置自动换行1.4 setIndent设置缩进1.5 setMargin设置边距1.6 body 2. QLCDNumber2.1 使用QTimer实现一个倒计时效果2.2 使用循环的方式实现倒计时 3. QProgressBar——进度…...

数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)

数据库管理247期 2024-10-04 数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)1 分区、表空间和Chunk(块)2 表空间组3 分片表4 分片表族5 复制表6 在所有分片上创建的非表对象总结 数据库管理-第247期 …...

Docker搭建一款开源的文档管理系统

1.系统介绍 Wizard是一款开源的文档管理系统,它支持多种格式类型的文档管理,包括Markdown、Swagger和Table,以适应不同场景和需求下的文档管理需求。 1.1功能特点 开源免费:Wizard是一款完全免费的开源项目,用户可以…...

软件验证与确认实验一:静态分析

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …...

基于SpringBoot+Vue的高校运动会管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

什么东西可以当做GC Root,跨代引用如何处理?

引言 在Java的垃圾回收机制中,GC Root(Garbage Collection Root,垃圾回收根)是垃圾回收器判断哪些对象是可达的,哪些对象可以被回收的起点。GC Root通过遍历对象图,标记所有可达的对象,而那些不…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...