【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的所有内容了,感谢你的阅读

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

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

相关文章

新家装修选中央空调如何选?认准约克VRF中央空调

在现代家居生活中,追求舒适和健康生活环境的家庭越来越倾向于选择中央空调系统。面对市场上琳琅满目的中央空调品牌,如何挑选一款合适的家用中央空调成为许多消费者的一大难题。今天,我们以约克VRF中央空调为例,深入探讨其特点和优势,为广大家庭提供一个舒适的选择答案。 首先…

IP可以申请SSL证书吗?

目录 背景: 申请IP证书的基本条件: 支持IP地址的证书类型: 为什么要申请IP地址证书? 如何申请IP地址证书 背景: IP地址是可以实现https加密需求的,且IP SSL证书可以完美的解决企业对于IP地址实现http…

标准库不带操作系统移植FreeModbus到STM32

添加FreeModbus代码 首先准备一个空白的标准库项目。 下载FreeModbus源码。 将源码中的modbus文件夹复制到项目路径下,并把demo->BARE->port文件夹的内容也添加进来。 新建一个文件port.c备用。然后打开项目,将上述文件添加至项目,…

Sectigo多域名ssl证书1200元

多域名SSL证书是可以同时保护多个域名的域名型数字证书之一,为个人和企事业单位提供了多样化的数字证书方案。各个正规的CA认证机构所颁发的多域名费SSL证书产品中,Sectigo旗下的多域名SSL证书是使用范围比较广的一款。今天就随SSL盾小编了解Sectigo旗下…

2024三掌柜赠书活动第十九期:DevOps企业级CI/CD实战

目录 目录 前言 关于CI/CD 企业级CI/CD实战 关于《DevOps企业级CI/CD实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《DevOps企业级CI/CD实战》全书速览 结束语 前言 作为开发者,对于编程语言并不陌生,随着技术圈的不断进步和发…

EI、Scopus双检索 | 2024年第四届控制理论与应用国际会议

会议简介 Brief Introduction 2024年第四届控制理论与应用国际会议(ICoCTA 2024) 会议时间:2024年10月18 -20日 召开地点:中国杭州 大会官网:www.icocta.org 控制理论作为一门科学技术,已经广泛地运用于我们社会生活方方面面。随着…

java-pytorch 使用手动下载FashionMNIST数据集进行测试

java-pytorch 使用手动下载FashionMNIST数据集进行测试 先定义训练数据和测试数据的位置查看一下读取到的标签数据格式使用loc和iloc访问下数据,便于下面操作使用read_image函数查看下图片的数据大小开始写数据集使用DataLoader去加载我们自己的数据看下加载后的dat…

游戏陀螺首条报道(一)|看完GDC 2024,我找到了网易数智引领游戏AI技术的关键!

经过近几年的爆发式增长,AI技术在游戏行业的应用取得了显著的进步。从去年多为“AI生成文字、图片、代码”等工具型应用,发展到了如今可以深入至游戏研发、运营的各个环节,这也让今年的游戏开发者大会(GDC)显得格外的热…

面试官:你是如何解决跨域的?

在近期的面试中,面试官针对我的项目,问到了 如何解决跨域? 没答好,我想通过这篇文章,巩固一下这方面的知识,分享一下我对于这个问题的理解,希望也能对大家有所帮助。 我的回答 跨域我们需要从浏…

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Spring Boot框架 …

IP/TCP--解决为什么电脑连上了有线网就不能再连WIFI【转载】

文章目录 第一种情况:WIFI与有线网在同一网段下1、查看路由信息2、调整跃点数 第二种情况:WIFI与有线网不在同一网段下跃点数概念路由器设置入口 【注意适用情型:需要同时用到内网(不能上公网的内部网络)和互联网。】 …

Spring Cloud+Spring Alibaba笔记

Spring CloudSpring Alibaba 文章目录 Spring CloudSpring AlibabaNacos服务发现配置中心 OpenFeign超时机制开启httpclient5重试机制开启日志 SeataSentinel流量控制熔断降级热点控制规则持久化集成 OpenFeign集成 Gateway MicrometerZipKinGateway路由断言过滤器 Nacos 服务…

什么是广告可见性测量 如何测量广告可见性

广告可见性测量 & 如何测量广告可见性 --- 一起来来认识MOAT 现在是2024年,大家或许还记得大约8年前广告可见性(Ad viewability)成为数字媒体世界的一种货币以来,出版商一直处于不利地位。当广告商用不同的工具和技术武装自…

在微信上处理小程序用户反馈具体的方法

想必大家在开发小程序的时候,一定遇到这种情况: 为了用户有更好的体验,我们会定期登陆微信小程序来查看用户反馈并对用户的问题进行回复和处理,但是这种方法的缺点就是最多间隔48小时要进行登陆一次以及回复用户不及时。 这样的话…

2月运动鞋行业线上电商数据分析:国产品牌高歌猛进,占据热榜90%

随着天气回暖,踏青出行的人越来越多,运动鞋市场呈现出繁荣状态,尤其是国产品牌。 根据鲸参谋数据显示,2024年2月在京东平台的运动鞋销量表现强劲,累计约233万件,同比上个月涨幅了58%;销售额累计…

泛型的通配符及擦除机制详解

目录 一、通配符解决什么问题 二、通配符上界 三、通配符下界 ​编辑 四、泛型类的擦除机制 引言: 在这篇文章中,我主要介绍前一篇泛型没介绍完整的泛型通配符和泛型的擦除机制Java中泛型的详细介绍 ? 用于在泛型的使用,即为通配符 一、通…

Qt+OpenGL入门教程(二)——OpenGL渲染管线

渲染管线是图形学不可或缺的,在学习它之前,我们先了解一下什么是管线? 管线/流水线 当我们谈到管线时,我们指的是一个由多个阶段组成的过程,每个阶段都完成任务的一部分。在现实世界中,流水线的概念在许多…

小白了解Pinia第2集 · 三大核心状态Getters、Actions以及Plugins 插件

三大核心状态 state 第1集有详细讲解:https://blog.csdn.net/qq_51463650/article/details/137137080?spm1001.2014.3001.5501 getters Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个…

C++从入门到精通——缺省参数

缺省参数 前言一、缺省参数概念二、缺省参数分类位置参数的缺省参数全缺省参数半缺省参数 关键字参数的缺省参数函数指针的缺省参数lambda表达式 三、缺省参数的具体代码展示main.cpp 前言 缺省参数是在函数定义时指定的默认值,当调用函数时未提供该参数的值时&…

统信 UOS V20 一键安装 Oracle 12CR2(220118)单机版

Oracle 一键安装脚本,演示 统信 UOS V20 一键安装 Oracle 12CR2(220118)单机版过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址:…