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

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言: 

在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。

目录

1. 啥是JDBC?

2. JDBC依赖包

2.1 依赖包下载流程

2.2 导入依赖包

3. JDBC常用的接口和类

3.1 Connection接口

3.2 Statement对象

3.3 ResultSet对象

4. JDBC的使用

4.1 创建并初始化数据源

4.2 与数据库服务器建立连接

4.3 构造sql语句

4.4 执行sql语句

4.5 遍历结果集

4.6 释放资源 

4.7 最终效果展示

1. 啥是JDBC?

JDBC 翻译中文为 Java数据库连接,通俗的来讲,JDBC 就是能使 Java 连接关于数据库的一个API。这个 API 是由 java.sql.* jva.sql.* 包中的接口和类组成的。

API在此做个简单的介绍,有的人认为它是一个接口可以这样去说,更好的理解为它是多个特定模块封装起来的一个功能包。而在本文中 JDBC 就是 Java 操纵数据库的一个API。


2. JDBC依赖包

在使用 JDBC 之前,我们必需把依赖包 mysql-connector-java-5.1.47.jar 导入到 Java 项目中。依赖包的获取方式:GitHub、MySQL官网、maven仓库。但 GitHub 有些慢,MySQL官网不好找,因此推荐在 maven仓库 中下载。

上述依赖包的版本号5.1.47,以大版本号为主,小版本号无所谓。什么意思?就是你下载的MySQL版本是 5 你就下载依赖包以 5 开头的版本,至于是5.几都可以。 


2.1 依赖包下载流程

第一步,浏览器搜索maven仓库。


第二步,在搜索框搜索 mysql 并进入MySQL Connector Java。


第三步,进入MySQL Connector Java后,找到 5 开头的版本。为啥呢,你下载的MySQL是版本几就下版本几。因为博主用MySQL是 5 版本的,因此下载 5 开头的都行。


 第四步,进入MySQL Connector Java 》5.1...后,点击jar下载即可。


2.2 导入依赖包

下载好依赖包后,我们直接把依赖包 mysql-connector-java-5.1.47 复制并粘贴到Java项目当中,具体操作流程如下:

第一步,将下载好的.jar文件复制。


第二步,将复制好的 mysql-connector-java-5.1.47.jar 文件粘贴至创建好的项目当中,以项目中出现该.jar文件为准代表粘贴成功。


第三步右击粘贴好的 mysql-connector-java-5.1.47.jar 文件,修改为Libray。点击Add as Library即可。

 第四步mysql-connector-java-5.1.47.jar 文件下出现三个子目录,代表着导入成功。

在把依赖包导入到项目当中后,我们就能安心的使用 JDBC 进行编程了。下面我就来讲解关于 JDBC 的使用方法。


3. JDBC常用的接口和类

在JDBC常用的接口和类这节讲解中,大家很多地方可能第一时间不能够很好的理解。建议跳过,先看4. JDBC的使用后,在回来看这一小节。


3.1 Connection接口

数据库连接 接口即 Connection 接口实现类是由数据库提供的,获取到Connection对象的最合适的方法为:

是通过DataSource(数据源)对象来获取,如下代码的展示:

//实例化MysqlDataSource对象(向上转型)
DataSource datasource = new MysqlDataSource();
((MysqlDataSource) datasource).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) datasource).setUser("root");
((MysqlDataSource) datasource).setPassword("填你的密码");//创建来连接数据库
Connection connection = datasource.getConnection();

以上代码,就是连接Java连接数据库的操作。具体的实现的原理,在下方4. JDBC的使用中有详细介绍。

解释: 

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


3.2 Statement对象

Statement对象是将SQL语句发送到数据库中。JDBC 这个 API 中提供了三种Statement对象:

(1)Statement对象:

  • 用于执行不带参数的简单SQL语句

(2)PreparedStatement对象:

  • 用于执行带或者不带参数的SQL语句
  • SQL语句会编译在数据库系统
  • 执行速度快于Statement对象

(3)CallableStatement对象:

  • 用于执行数据库存储过程的调用

综上所述,我们在实际开发中最常用的就是 PreparedStatement对象 。 因此我们在实例化PreparedStatement对象时一般这样操作:

PreparedStatement statement = connection.prepareStatement(sql);

在上述代码中,connection为Connection类型的引用,prepareStatement方法则是把Java编写的SQL语句传入MySQL数据库


3.3 ResultSet对象

ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的 next() 方法 ,如果我们想要得到 ResultSet 里的所有记录,就应该使用 while 循环。

如下图所示,next方法 第一次获取第一行数据,第二次获取第二行数据,直到最后没有数据了 while 循环结束。

executeQuery()方法 会把数据库响应的查询结果存放在 ResultSet对象 中供我们使用。

语法为:ResultSet  引用名 = new PreparedStatement类型的引用.executeQuery();因此,可以这样去写代码:

PreparedStatement statement = connection.prepareStatement(sql);//把sql语句传入数据库String sql = "select * from student";//写入sql语句ResultSet resultSet = statement.executeQuery();//实例化Resultset类型的对象while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = "+id+" name = "+name);}//遍历表中信息

在对结果集进行遍历的时候,while循环里面的参数是根据数据表中字段来确定的。如果数据表里面的字段有int,varchar 这两个类型那么我们就使用 getInt方法、getString方法 来分别获取这两个字段。当然必需得是 ResultSet类型 的引用。如果表中数据是其他类型,则按照 getXXX方法 来获取即可。


4. JDBC的使用

在了解到了 JDBC 的常见接口与对象后,我们就可以使用 JDBC 来进行编程了。JDBC 的使用步骤如下:

  1. 创建并初始化一个数据源
  2. 与数据库服务器建立连接
  3. 构造 SQL 语句
  4. 执行 SQL 语句
  5. 遍历结果集
  6. 释放必要的资源

首先,我们在数据中创建一个名为 test 的数据库并在该数据库中创建一个名为 student 的表:

//创建test数据库
mysql> create database test charset utf8;
Query OK, 1 row affected (0.00 sec)//使用test数据库
mysql> use test;
Database changed//创建student表
mysql> create table student(-> id int,-> name varchar(20)-> );
Query OK, 0 rows affected (0.02 sec)//查询全表内容
mysql> select * from student;
Empty set (0.00 sec)

此时的 student 表中没有任何数据,下方我们来通过 JDBC 编程使 student 增添数据。


4.1 创建并初始化数据源

MysqlDataSource 是 MySQL的数据源,因此我们得实例化一个 MysqlDataSource 。

当然,我们一般使用 DataSource类 来实例化 MysqlDataSource,因此会进行向上转型效果。

DataSource dataSource = new MysqlDataSource();//向上转型

为啥不直接使用 MysqlDataSource类型 来实例化呢?这样去理解:DataSource类里面有的方法DataSource类的引用能够使用用,MysqlDataSource里面有的方法DataSource类型的引用也能够用。因此,我们宁愿向上转型。


4.2 与数据库服务器建立连接

Java 与 MySQL数据 连接的URL参数格式如下:

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

万能的URL:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false

以上的URL大家可以直接复制粘贴使用即可,唯一需要更改的是数据库名。把 test 更改为你所要操作的数据库。如下方连接我创建的 test 数据库。


以下为与数据库服务器建立连接代码及解释:

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("你的密码");//与数据进行连接
Connection connection = dataSource.getConnection();

在 dataSource 使用的方法中:

  • setUrl 是表明MySQL数据库的来源
  • setUser 是表明MySQL数据库的账号(下载时的账号默认为root)
  • setPassword 是MySQL数据库密码

除了URL中的数据库不确定外,账号、密码就是你下载MySQL数据库时你设置的MySQL账号和密码,相信大家都还记得。


4.3 构造sql语句

静态的构造方法:

构造sql语句,我们使用 String 类型的变量来初始化 sql 语句。初始化好的变量我们直接通过  prepareStatement 这个方法把该变量传入数据库中,这样数据库拿到的就是一条 sql 语句了。

//静态构造sql语句
String sql = "insert into student value(101,'张三')";//插入sql语句

通过上方代码,大家乍一看。这不是在 Java 编译器里面写 SQL 语句吗?没错,其实 JDBC 编程就是通过在 Java 编译器里面引入一些 SQL 语句来达到操作数据库的效果。


动态构造方法:

当然以上的写法,是把 sql语句 固定死了,这样在就不能与用户达到交流。因此,我们可以通过键盘输入来达到动态输入效果。

//动态构造sql语句
Scanner scanner = new Scanner(System.in);
String sql = "insert into student value(?,?)";System.out.println("请输入id:");
int id = scanner.nextInt();System.out.println("请输入name:");
String name = scanner.next();statement.setInt(1,id);
statement.setString(2,name);

通过键盘输入,我们需要将value里面的值替换为?号,再通过对应的set方法来进行对应值的输入。在我的 student 表中


4.4 执行sql语句

通过 prepareStatement方法 把sql语句发送到数据库中,当然我们得使用 Connection类型 的引用来调用 prepareStatement方法。

//通过prepareStatement方法把sql语句发送到数据库
PreparedStatement statement = connection.prepareStatement(sql);

4.5 遍历结果集

遍历结果按照ResultSet类型下的executeQuery方法来获取,在使用next()方法来达到遍历。在上方 3.3ResultSet类 中讲解到了,因此可以写出以下代码:

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

4.6 释放资源 

释放按照先进后出的顺序进行释放,什么意思呢?先执行的方法,我们先进行释放,后执行的方法我们后释放,按照栈的顺序先进后出

//通过close方法释放必要的资源
statement2.close();
statement1.close();
connection.close();

为啥要释放资源,在 Java 连接 MySQL数据库 并且传 SQL语句 时占用着内存中的空间。如果我们不使用 close方法 进行关闭连接的状态将一直保持着占用资源的状态,因此我们得释放这些连接。


4.7 最终效果展示

JDBC的 6 个步骤展示

public static void main(String[] args) throws SQLException {//1.创建并初始化数据源DataSource dataSource = new MysqlDataSource();//2.与数据库服务器建立连接((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root(填你自己的账号)");((MysqlDataSource)dataSource).setPassword("我的密码(填你自己的密码)");Connection connection = dataSource.getConnection();//3.构造sql语句String sql1 = "insert into student values(101,'张三'),(102,'李四'),(103,'王五')";String sql2 = "select * from student;";//4.执行sql语句PreparedStatement statement1 = connection.prepareStatement(sql1);PreparedStatement statement2 = connection.prepareStatement(sql2);int ret = statement1.executeUpdate();System.out.println("修改了"+ret+"条信息");//显示修改信息//5.遍历结果集ResultSet resultSet = statement2.executeQuery();System.out.println("Student表信息:");while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = "+id+" name = "+name);}//6.释放资源statement2.close();statement1.close();connection.close();}

Java编译器输出:

MySQL窗口显示:

上述代码中的 executeUpdate方法 具体实现效果如下:

  1. executeUpdate的返回值是一个整数,指受影响的行数(即更新计数)
  2. 对于create table或drop table等不操作行的语句,executeUpdate的返回值为零

🧑‍💻作者:程序猿爱打拳,Java领域新星创作者,阿里云社区博客专家。

🗃️文章收录于:MySQL数据库

🗂️JavaSE的学习:JavaSE

🗂️数据结构的学习: 数据结构与算法


本片博文到这里就结束了,如有收获还请给博主点个小小的关注,感谢您的支持~

相关文章:

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言: 在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程…...

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…...

【Java EE 初阶】线程安全及死锁解决方案

目录 1.多线程下线程不安全的问题 1.使用多个线程对Array List集合进行添加操作并打印,查看结果 2.如何在多线程环境下使用线程安全的集合类 CopyOnWriteArrayList 3.多线程环境下使用队列 4.多线程环境下使用哈希表 1.HashTable线程安全 2.Concurrent Hash M…...

C语言函数大全-- _w 开头的函数(5)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wspawnl 1.1 函数说明 函数声明函数功能int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...);启动一个新的进程并运行指定的可执行文件 参数: mode : 启动命令的…...

机械大专生能学会云计算吗,完全零基础的

机械大专生能学会云计算吗,完全零基础的 正常来说,大专及以上学历都能学会云计算,但是会和满足就业需求是两回事哈。如果你想通过学习就业,就需要根据当下相关岗位的普遍技术需求以及其他方面的要求,来针对性的学习和提…...

腾讯云EdgeOne为什么能让客户降本增效?

随着数字化时代的来临,各类线上互动场景不断出现,并成为人们日常工作生活中的一部分。然而,基于互联网提供线上娱乐、线上办公、线上购物等服务的企业,在复杂的全球网络环境下会遇到网络延迟不稳定的情况,海外环境更多…...

基于粒子群算法的微网经济优化调度——附Matalb代码

目录 摘要: 代码主要内容: 研究背景: 微电网模型: 粒子群算法: 运行结果: Matlab代码分享: 摘要: 提出了一种经济与环保相协调的微电网优化调度模型,针对光伏电池…...

Flink入门

目录 一、Flink简介 二、为什么选择Flink 三、与传统数据处理架构相比 四、Flinik批处理数据基础代码 五、Flink流处理基础代码 一、Flink简介 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数 据流进行状态计算。 二、为什么选择Flink 流数据更…...

【Go微服务开发】gin+grpc+etcd 重构 grpc-todolist 项目

写在前面 最近稍微重构了之前写的 grpc-todolist 模块 项目地址:https://github.com/CocaineCong/grpc-todoList 1. 项目结构改变 与之前的目录有很大的区别 1.1 grpc_todolist 项目总体 1.1.1 改变前 grpc-todolist/ ├── api-gatway // 网关模块 ├── ta…...

单板硬件设计:存储器SD卡( NAND FLASH)

在单板设计中,无论是涉及到一个简易的CPU、MCU小系统或者是复杂的单板设计,都离不开存储器设计: 1、存储器介绍 存储器的分类大致可以划分如下: ROM和RAM指的都是半导体存储器,ROM在系统停止供电的时候仍然可以保持数…...

C++实现日期类Date(超详细)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…...

实验室检验系统源码,集检验业务、质量控制、报告、统计分析、两癌等模块于一体

云 LIS 系统针对区域化 LIS 而设计,依托底层云架构,将传统的 LIS 功能模块进行“云化”。 该系统是集检验业务、科室管理、质量控制、报告、统计分析、两癌等模块于一体的数据检验信息平台。通过计算机联网,实现各类仪器数据结果的实时自动接…...

学习RHCSA的day.03

目录 2.6 Linux系统的目录结构 2.7 目录操作命令 2.8 文件操作命令 2.6 Linux系统的目录结构 1、Linux目录结构的特点 分区加载于目录结构: 使用树形目录结构来组织和管理文件。整个系统只有一个位于根分区的一个根目录(树根)、一棵树。…...

电子邮件协议(SMTP,MIME,POP3,IMAP)

SMTP 关键词: 电子邮件协议:SMTP简单邮件传输协议,负责将邮件上传到服务器,采用TCP的25端口,C/S工作。仅传送ASCII码文本 详细介绍: SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上…...

Golang笔记:使用embed包将静态资源嵌入到程序中

文章目录 目的使用演示//go:embed 指令在WebServer中应用总结 目的 Golang编译程序默认是静态编译,会把相关的库都打包到一起,这在分发部署使用时非常方便。不过如果项目中用到的外部的静态资源文件,通常就需要将这些资源和程序一起拷贝分发…...

ImportError: cannot import name ‘OldCsv‘ from ‘pyflink.table.descriptors‘

我最近开始使用flink用于数据处理。 当我尝试执行table api 用于计数时 我不能导入OldCsv and FileSystem from pyflink.table.descriptors. I have also downloaded apache-flink using: pip install apache-flink [rootmaster flink]# pip3 list | grep flink apache-fli…...

YouCompleteMe(YCM)安装

vim在各个linux版本中是个比较好编辑器,反正nano我是用不惯。但这个ycm的安装也是不断的在变,现在的安装比之前要简单的多,基本个几命令就搞定了,而且 也不用关心系统里有没有vim,ycm已经可以自动安装。具体安装步骤如下&#xff…...

day33_css

今日内容 零、 复习昨日 一、CSS 零、 复习昨日 见代码 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文…...

10个最流行的向量数据库【AI】

矢量数据库是一种将数据存储为高维向量的数据库,高维向量是特征或属性的数学表示。 每个向量都有一定数量的维度,范围从几十到几千不等,具体取决于数据的复杂性和粒度。 推荐:用 NSDT场景设计器 快速搭建3D场景。 矢量数据库&…...

vite3+vue3 项目打包优化二 —— 依赖分包策略

在没有配置构建工具的分包功能时,构建出来的文件将无比巨大且是独立的一个 js 和 css 文件(如下图),这样本地加载文件时会存在巨大的压力。 默认情况下,浏览器重复请求相同名称的静态资源时,会直接使用缓存…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...