【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的MySql学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

​ 一.准备工作

JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。

1.准备数据库驱动包

首先我们需要打开中央仓库Maven Repository: Search/Browse/Explore (mvnrepository.com)

​ 

2.在IDEA上的准备工作

1.帮刚才下载好的这个.jar文件复制

​ 2.粘贴到你要连接数据库的相应的文件

3.再右键点击.jar文件,添加为库

4.完成结果展示

二.JDBC的使用

1.在数据库中建好相应的表

这里博主就在MySql上随意创建了一张students表作为测试使用(当然你也可以在IDEA创建,不过一般来说我们都是在MySql上提前创建好表)

 create table students(id int primary key ,name varchar(20),age int);

 2.创建DataSource数据源

DataSource 数据源.
要操作的数据库,数据, 是在哪里,
在 MySQL 中,就需要设定好,MySQL 服务器的位置,要访问的数据库的名字,访问数据库的用户名和密码.

// 1. 创建 "数据源" (DataSource)DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/textcharacterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("010920");

1.说明

1. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/textcharacterEncoding=utf8&useSSL=false");

URL:
协议的名称://ip地址:端口号/数据库名?参数=值&参数=值

一般来说,只需要你修改一下数据库名,别的复制粘贴即可

2.   ((MysqlDataSource) dataSource).setUser("root");

设置用户名,mysql 中可以手动创建各种名字的用户默认会自带一个 root 用户root 是一个管理员账户,(权限最大的账户),一般这段也是照抄即可

3.  ((MysqlDataSource) dataSource).setPassword("010920");

设置密码,输入你当时数据库设置的密码即可,如果你没有设置密码的话可以将密码设置为一个空字符串或者null.

((MysqlDataSource) dataSource).setPassword("");//空字符串
((MysqlDataSource) dataSource).setPassword(null);//null

同时需要注意的是不同数据库这里的操作不一样,这里博主介绍的是Mysql数据库的操作方法,对于别的数据库操作不一样 

3.建立连接

进行 客户端·服务器 之间通信的时候,常见有两种通信的模式:
1)有连接 (JDBC 这里, 就属于是"有连接” 就需要先拨号)
2)无连接

 Connection connection = dataSource.getConnection();

注意这里可能会出现异常,我们需要抛出异常

 

 如果一切顺利,连接建立成功,此时就能够得到 Connection 对象.在 getConnection 很可能失败的(服务器没有接受连接)原因有很多种,包括不限于:
1)数据库服务器没有正确启动.
2) url 写错了
3)用户名写错了
4) 密码写错了
5)网络断开了(网线掉了...)

.....

4.构造Sql语句

String sql = "insert into students values(1,'张三',18)";

5.创建语句对象

PreparedStatement preparedStatement = connection.prepareStatement(sql);
  1. 通过connection对象创建了一个PreparedStatement对象,connection是一个表示数据库连接的对象。
  2. sql是一个包含SQL语句的字符串变量,它作为参数传递给prepareStatement方法,用于创建一个预编译的SQL语句的对象。
  3. preparedStatement是一个用于执行SQL语句的对象,它可以用来执行查询、更新或删除数据库中的数据。

通过使用PreparedStatement对象,可以有效地执行SQL语句并防止SQL注入攻击。

6.开始运行与结果

int n = preparedStatement.executeUpdate();System.out.println("n = " + n);

这段代码是在Java中使用PreparedStatement对象执行更新操作,并获取更新的行数。具体来说,这段代码做了以下几件事情:

  1. executeUpdate()方法用于执行SQL语句并返回受影响的行数。在这里,通过调用preparedStatement.executeUpdate()方法执行了SQL语句,并将返回的受影响行数赋给整型变量n
  2. System.out.println("n = " + n);这行代码用于将更新的行数n输出到控制台。这样可以查看执行SQL语句后影响的行数,以便进行后续的处理或调试。

总之,这段代码执行了SQL更新操作,并输出了更新的行数。

结果:

这里显示的就是我们对students表的插入操作,并更新了1行结果

这时我们在查看数据库的信息可以看到如下结果

 这样就实现了通过java来交互数据库的数据了;

7.收尾工作

preparedStatement.close();connection.close();
执行完毕, 有收尾操作. 释放前面创建的各种资源.主要是释放 语句对象 和 连接对象. DataSource 是不必释放的.

大家都知道,jvm会帮我们做收尾工作,为什么我们还需要手动释放呢,我们手动释放是为了:

在Java中,当使用完数据库连接和PreparedStatement等资源后,最好手动关闭这些资源以释放数据库连接和其他相关资源,而不是依赖JVM的垃圾回收机制来释放资源。尽管JVM会在适当的时候回收不再使用的对象,但是对于数据库连接等资源,及时手动关闭是一个良好的编程习惯,可以避免资源泄霍和提高程序的性能。

8.手动输入数据

我们刚刚看到前面的第四点,构造Sql语句时,我们是直接定好了要输入的数据,当如果我们想手动输入数据的话我们可以使用如下的方法

Scanner scanner = new Scanner(System.in);System.out.println("请输入学号: ");int id = scanner.nextInt();System.out.println("请输入姓名: ");String name = scanner.next();System.out.println("请输入年龄: ");int age = scanner.nextInt();String sql = "insert into students values(?, ?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, id);preparedStatement.setString(2, name);preparedStatement.setInt(3, age);

查看结果:

 

9.插入操作的全部代码

这里也可以执行多条Sql语句,使用一下循环即可,这里就不过多的赘述

 public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/text?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("010920");Connection connection = dataSource.getConnection();Scanner scanner = new Scanner(System.in);System.out.println("请输入学号: ");int id = scanner.nextInt();System.out.println("请输入姓名: ");String name = scanner.next();System.out.println("请输入年龄: ");int age = scanner.nextInt();String sql = "insert into students values(?, ?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, id);preparedStatement.setString(2, name);preparedStatement.setInt(3, age);int n = preparedStatement.executeUpdate();System.out.println("n = " + n);preparedStatement.close();connection.close();}

10.查询操作

上文介绍了插入操作的过程,由于删除操作和,修改操作都差不多,只需要修改Sql语句,博主就不过多的赘述了,这里解释一下与它们不同的查询操作的写法

public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/text?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("010920");Connection connection = dataSource.getConnection();Scanner scanner = new Scanner(System.in);System.out.println("请输入要查询的学生姓名: ");String name = scanner.next();String sql = "select * from students where name = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, name);ResultSet resultSet = preparedStatement.executeQuery();while(resultSet.next()) {int id = resultSet.getInt("id");String studentName = resultSet.getString("name");int age = resultSet.getInt("age");System.out.println("学号: " + id + ", 姓名: " + studentName + ", 年龄: " + age);}preparedStatement.close();connection.close();
}

在执行查询操作时,与执行插入操作相比,有以下不同之处:

  1. SQL语句不同:查询操作使用SELECT语句,而插入操作使用INSERT语句。
  2. 参数设置不同:查询操作通常需要设置查询条件的参数,而插入操作需要设置插入的数值。
  3. 执行方法不同:查询操作使用executeQuery()方法执行查询,而插入操作使用executeUpdate()方法执行插入。
  4. 结果处理不同:查询操作需要通过ResultSet对象处理查询结果,而插入操作通常不需要处理返回结果。

这些是执行查询操作与插入操作的主要不同之处。在实际开发中,根据具体需求和业务逻辑,会有更多细微的差别和处理方式。

查询结果如下:

 三.一些问题汇总和解决方法

1.数据库没有连接上

如果出现上面这样的错误,你就应该要查看是否IP输入错误,或者是端口号输入错误

2.数据库名输入错误

如果出现上面这样的错误,你就应该要查看你数据库名是否输入错误

3.用户名/密码输入错误

这个时候你就要检查一下密码和用户名是否输入失败了,如果你忘记密码的话可以执行以下几点步骤:

1. 关闭正在运行的MySQL服务。win+r输入:services.msc回车,找到MySQL,手动关闭MySQL服务

2. 打开DOS窗口,利用cd命令转到mysql的bin目录:建议直接找到mysql的bin目录下输入cmd回车3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。

4. 再开一个DOS窗口(刚才那个DOS窗口已经不能动了),转到mysql的bin目录。

5. 输入mysql回车,如果上面修改成功,将直接出现 mysql> 这样的提示符。

6. 连接权限数据库:use mysql

6. 改密码:update user set password=password("123") where user="root";

7. 刷新权限(必须步骤):flush privileges; (不要忘记分号)

8.exit或者ctrl+c退出,进行重新登陆

以上就是JDBC的所有内容了,感谢你的阅读

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

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

相关文章

java switch用法

满足那个条件,就从那个入口进入,没有break就继续(是这样设计的,需要自己加break;),一般都是要加break的。 switch (表达式) 表达式只能是【整型、char、String.】 import java.util.Scanner;public class…

微服务day07 -- ES集群

4.集群 单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点 单点故障问题:将分片数…

Review(一)

🌈个人主页:Rookie Maker 🔥 系列专栏:Rookie review 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x1f601…

DRC检查及丝印的调整

DRC检查及丝印的调整 综述:本文主要讲述AD软件中DRC检查、丝印的调整以及logo的添加的相关步骤,附加logo添加的脚本链接和大量操作图片,使步骤详细直观。 1. 点击“工具”→“设计规则检查”→“运行DRC”。(一开始可以只开启电…

一个程序从编译到运行的全过程

一个程序从编译到运行的全过程 一个程序从编译到运行的全过程编译预处理编译 汇编链接载入虚拟内存用户空间 总结 一个程序从编译到运行的全过程 每次用编译器写完一个程序后,我们会进行调试和执行,将代码的结果输出在我们的电脑屏幕上,但是…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

全民采矿石赚钱小程序源码,附带详细搭建教程

安装教程 1、环境用宝塔Nginxphp7.0或者以下版本 2、可以更换各种模板,懂代码和标签的可以改模板,不懂的可以直接上站 3、上站前记得添加关键词和内容库 4、伪静态在绑定完百度站长之后再添加 目录说明: data/keyword 放关键词 标签&#xff…

OpenLayers基础教程——WebGLPoints图层样式的设置方法

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法,这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中,我们只需要创建一个ol.style.Style对象即可,WebGLPoints则不…

浅谈Webmail邮件还原

Webmail还原,其实也就是HTTP协议的还原,而HTTP协议的还原,核心部分是TCP会话的重组。在TCP会话进行重组之后,再对重组的报文进行HTTP解析,得到Webmail中相应的信息。 由于每个邮件服务商实现Webmail的方式都各不相同&a…

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重,寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统,该系统能够实时采集环境噪声,并通过先进的信号处理技术实现主动降噪,从而有效改善生活和工作环…

CV论文--2024.3.26

1、DiffusionMTL: Learning Multi-Task Denoising Diffusion Model from Partially Annotated Data 中文标题:DiffusionMTL:从部分注释的数据中学习多任务去噪扩散模型 简介:最近,人们对于从部分标注数据中学习多个密集场景理解任…

qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中&#xff0c; 难免会使用 table 进行渲染窗口&#xff0c;做一个简单的封装。美化表格最终效果&#xff01;&#xff01;&#xff01; 代码部分 // 显示 20行 20列CCendDetailsInfoTableWidget* table new CCendDetailsInfoTableWidget(20,10);for (int i 0; i < …

蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接&#xff1a; 0买瓜 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com) &#xff08;蓝桥官网的数据要求会高一些&#xff09; 说明&#xff1a; 这道题可以分析出&#xff1a;对一个瓜有三种选择&#xff1a; 不拿&#xff0c…

Hbase解决ERROR: KeeperErrorCode = ConnectionLoss for /hbase/master报错

在使用hbase时出错&#xff0c;错误如下图&#xff1a; 错误原因&#xff1a; 返回去检查启动的Hadoop与zookeeper&#xff0c;发现zookeeper的状态不对&#xff0c;重新启动了一下zookeeper&#xff0c;确保所有机器的zookeeper都启动起来了就可以了。

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …

【Python机器学习系列】skearn机器学习模型的保存---pickle法

这是我的第246篇原创文章。 一、引言 pickle是Python 的标准库&#xff0c;用于序列化对象。可以使用 pickle.dump()将模型保存到文件&#xff0c;然后使用 pickle.load()从文件中加载模型。 序列化&#xff1a;指将一个对象转换为字节流&#xff0c;能够存储在文件或网络上&…

计算机网络:现代通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…