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

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.Buffer_Overflow-1.Basic_Jump

github上面的练习题 git clone https://github.com/Adamkadaban/LearnPwn 然后开始做 先进行 readelf 然后进行执行看看 是怎么回事 ./buf1发现就是一个输入和输出 我们checksec看看 发现stack 保护关闭 开启了NX保护 我们进入ida64看看反汇编 我习惯先看看字符串 SHITF…

C#异步编程之数据并行及任务并行

基于Parallel.ForEach的数据并行使用 1.数据非并行 var items new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; DateTime t1 DateTime.Now; foreach (var item in items) {Console.WriteLine("数据非并行输出:{0}", item); } 2.数据并行,只要使用Parallel.ForEach P…

Docker高频使用命令总结(镜像与容器命令)

目录 一.Docker常用命令总结 1.镜像命令管理 2.容器命令管理 二.Docker镜像操作命令 1.docker search:搜索镜像 2.docker pull:下载镜像 3.docker push:上传镜像 4.docker images:查看本地镜像 5.docker inspect &#x…

360+ChatGLM联手研发中国版“微软+OpenAI”

文章目录 前言360与智谱AI强强联合什么是智谱AI360智脑360GLM与360GPT大模型战略布局写在最后 前言 5月16日,三六零集团(下称“360”)与智谱AI宣布达成战略合作,双方共同研发的千亿级大模型“360GLM”已具备新一代认知智能通用模…

Springboot——事物管理

文章目录 事务管理一、 Spring事务管理1.1 事务回顾1.2 案例: 解散部门(未开启事务)1.3 事务管理注解Transactional1.4 事务管理日志开关1.5 rollbackFor 异常回滚属性1.6 propagation 事务传播行为1.7 解散部门并记录操作日志1.7.1 创建数据…

技术探秘:揭秘Bean Factory与FactoryBean的区别!

大家好,我是小米,一个热衷于技术分享的29岁小编。今天,我们来聊一聊在Spring框架中常用的两个概念:beanFactory和FactoryBean。它们虽然看似相似,但实际上有着不同的用途和作用。让我们一起来揭开它们的神秘面纱吧&…

离散数学_九章:关系(6)

🪐9.6 偏序 1、⛺偏序关系和偏序集⛲偏序关系⛲偏序(关系)的例子 a. “大于或等于” 关系b. “整除” 关系c. “包含” 关系 🎬偏序集🎬可比性(comparability) " ≼ " 符号a. 可比 &a…

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1)

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1) 苹果采摘机器人1、采摘流程与硬件设计2、机械臂驱动以及采摘轨迹设计2.1、台达A2电机驱动实现2.2、机械臂寻找苹果巡逻轨迹 苹果采摘机器人 1、采摘流程与硬件设计…

C++/Qt 小知识记录3

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识 QLineEdit限制输入大于0的正整数QLayout内清空已布局的WidgetWindows结束进程直接结束,子进程不响应结束事件正常结束,子进程响应结束事件 CMake关闭控制台Console实体与值对…

尾调用优化

尾调用优化 最近遇到一个堆栈溢出的问题,分析后发现可收敛为递归边界问题。结合“红宝书”中相关内容和ES6规范中的一些优化机制,整理记录如下。 前言 程序运行时,计算机会为应用程序分配一定的内存空间。应用程序会自行分配所获得的内存空…

数组或结构体赋值时memcpy与直接赋值的效率比较

先上结论: 二者不一定谁快通常情况下,数组维度越大,使用memcpy效率更高数组维度越大,直接赋值耗时主体是循环耗时 Note: “等号赋值”被编译器翻译成一连串的MOV指令,而memcpy则是一个循环。“等号赋值”比…

深入解析PyTorch中的模型定义:原理、代码示例及应用

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

【一起啃书】《机器学习》第六章 支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …

Day 1 认识软件测试——(软件测试定义、目的、原则)

Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…

《我命由我不由天》蔡志忠——笔记一

目录 简介 经典摘录 三岁决定一生 父母该什么时候放手 确定将来要成为什么 积极主动为目标而努力 叛逆是最伟大的创意 父亲给蔡志忠最大的影响是教会他两件事 价值观缺陷导致的后果 人有三个阶段 简介 作者 蔡志忠,李虹。 蔡志忠:漫画家、哲…

Vue加SpringBoot实现项目前后端分离

首先需要搭建一个Vue的脚手架项目(已经放在gitee里面了,下面是gitee网址,可以直接拉) (vue-web: 这个是Vue项目模板,没有后台数据) 那么接下来就是实现前后端分离的步骤 首先我们需要有一个登录页面 登录的点击事件利用…

图神经网络:(节点分类)在KarateClub数据集上动手实现图神经网络

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读:代码实操: 文献阅读: 参考文…

【Hello Algorithm】归并排序及其面试题

作者:小萌新 专栏:算法 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:介绍归并排序和几道面试题 归并排序及其面试题 归并排序归并排序是什么归并排序的实际运用归并排序的迭代写法归并排序的时间复杂度 归并排序算法题小…

(十一)地理数据库创建——创建新的地理数据库

地理数据库创建——创建新的地理数据库 目录 地理数据库创建——创建新的地理数据库 1.地理数据库概述2.地理数据库建立一般过程2.1地理数据库设计2.2地理数据库建立2.2.1从头开始建立一个新的地理数据库2.2.2移植已经存在数据到地理数据库2.2.3用CASE工具建立地理数据库 2.3建…

Python 科研绘图可视化(后处理)Matplotlib - 2D彩图

Introduction 科研可视化是将数据和信息转化为可视化形式的过程,旨在通过图形化展示数据和信息,使得科研工作者能够更好地理解和分析数据,并从中发现新的知识和洞见。科研可视化可以应用于各种领域,如生物学、物理学、计算机科学…