《mysql篇》--JDBC编程

JDBC是什么

JDBC就是Java DataBase Connectivity的缩写,翻译过来就很好理解了,就是java连接数据库。所以顾名思义,JDBC就是一种用于执行SQL语句的JavaApl,是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库,给Java程序员操作数据库提供了一个标准的API,不用因为使用了另一种数据库,就要学习另一套API,大大减少了学习和使用成本,同时提高了代码的可移植性。

//就是通过java代码操作mysql数据库

JDBC原理

JDBC 为多种关系数据库提供了统一访问方式,它主要包含一些通用的接口类。

下面我用画图的方式,介绍一下JDBC的原理:

首先由程序员开发Java应用,再调用JDBC的相关的API,就可以访问数据库的JDBC驱动程序,然后通过驱动来进行一系列的数据库操作

//JDBC相关的API是由sun公司提供的,相应的JDBC驱动则是由不同的数据库厂商提供

JDBC的使用

想要使用JDBC需要先安装对应的数据驱动包,并且将jar包导入项目中(具体操作博主这里就不展示了,如果有需要后续会专门出一篇博客来介绍相关操作)

当一切准备工作都做完了之后,就可以使用JDBC进行一些操作了

创建数据源

再连接数据库之前,我们要先找到数据库,方法不止一种,这里我介绍使用Datasource获取数据源

首先创建一个MysqlDatasource对象(DataSource是MysqlDatasource实现的一个借口,这里使用到了向上转型)

DataSource dataSource = new MysqlDataSource();

然后我们需要使用一些MysqlDatasource内特有的方法

((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("88*****8");

这些方法的意思我们暂且不管,这里你是否有疑问,我们明明要使用的是MysqlDatasource内特有的方法,确使用向上转型,这样不是反而不能使用这些方法了吗?即使之后又向下转型,将DataSource转为MysqlDatasource,这样不是多此一举吗?直接使用这种方法不也可以吗?

MysqlDataSource mysqlDataSource = new MysqlDataSource();

确实这样也是可以达成目的的,但是我们在实际写代码中,要尽量使我们的代码低耦合高内聚

因为我们使用的是MysqlDataSource,如果在项目中大量使用第二种方法,后续要是想要换数据库或者其他操作就会大大增加我们的工作量,所以为了让MysqlDataSource这个类名不要扩散到代码的其他地方,我们更推荐使用第一种方法。

这里简单介绍一下低耦合高内聚🌰:

低耦合:用来描述代码模块之间的依赖程度,列如有两个模块A,B其中B依赖A,那么每次A修改后都要修该B,那么A,B间就是耦合的

高内聚:表示某个特定的软件模块内部,是由很多相关性很强的代码构成,每个模块只负责一项任务,一个功能可以由各个模块通过聚合或组合等达到高度内聚,这样即使聚合的内容发生改变,也不用做很大的变动就等轻松的达到扩展的目的


接下来我们来介绍一下使用到的方法都是什么作用🤔

首先你是不是对setUrl后面那一长串的字符很疑惑,现在我用画图的方式介绍一下

之后的setUser("root")的意思就是输入用户名(mysql默认的用户名就是root),setPassword("88*  *****8")就是输入密码(就是在安装MySQL时自己设定的那个)

//这些时MySQL的认证方式,不同数据库的认证方式不同,在使用时需要加载不同的驱动包

建立和数据库服务器之间的连接

我们现在找到了数据库的位置了接下来就是要去连接数据库

 Connection connection = dataSource.getConnection();

连接的方式非常简单就这一行代码就行,我们调用dataSource接口的getConnection方法,这个方法会返回一个Connection对象,就可以和数据库建立起一个网络连接了

//注意要使用Java.sql包下的Connection

构建sql语句

以上步骤属于准备工作,接下来可以正式通过Java操作数据库了

既然要操作数据库,那我这里提前创建好了一个库

首先我们要写一条sql语句,需要以字符串的形式才行

String sql = ("insert into score values(11,23,99,99)");

 现在我们已经有了一条语句,接下来就是把这条语句发送给MySQL数据库

PreparedStatement preparedStatement = connection.prepareStatement(sql);

 JDBC API主要提供了三种Statement对象供我们使用

  • Statement
  • PrepareStatement
  • CallbleStatement

我们平时用的比较多的是PrepareStatement,翻译过来就是预处理语句,在执行我们发送的sql语句前,它会先解析检查sql,看看是不是有什么问题,解析完毕之后,就会得到结构化数据,直接把解析好的结构化数据发送给服务器,服务器就省下了这部分解析的工作,间接减小了数据库的开销

执行sql语句

刚刚我们执行的是一条insert语句,需要通过PrepareStatement调用executeUpdate方法

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

 executeUpdate()方法会返回一个整数,表示受到影响的行数,通常用于,update,insert,delete语句

如果要进行查询操作则一般使用executeQuery()方法,该方法执行后会返回查询到的单个结果集

关闭连接,释放资源

在我们执行完之后要释放掉我们创建的资源

preparedStatement.close();
connection.close();

 释放时要遵循后创建的先释放

//到这里我们就完成了使用Java语句来控制我们的数据库

测试结果

//数据成功的插入到我们创建的表中🐱🐱

进阶使用

手动输入

如果根据刚刚的方法构造sql语句,难道当我们每执行一条sql就要改一下代码?显然是不合理的,我们可以利用Scanner来手动输入我们要插入的数据,这既提高了效率,也不必那么麻烦

  Scanner scanner = new Scanner(System.in);System.out.println("请输入名字");int name = scanner.nextInt();System.out.println("请输入语文成绩");int Chinese = scanner.nextInt();System.out.println("请输入英语成绩");int English = scanner.nextInt();System.out.println("请输入数学成绩");int math = scanner.nextInt();String sql = ("insert into score values
("+ name +","+ Chinese +","+ English +","+  math +")");

查看运行结果

//可以看到我们使用这种方法,数据依然可以成功的插入表中

防止SQL注入攻击

刚刚的方法虽然高效了一些好像还差点意思,似乎不简洁,而且如果使用这种方法的话,还可能会引起SQL注入攻击

SQL注入攻击:黑客通过代码的形式,将我们构造的sql语句恶意篡改,甚至可以通过一些方法看到我们数据库里的数据(对于学生党来说这个影响不大,因为我们电脑里一般也没啥值钱的数据😥😢)

 我们可以使用preparedStatement的占位符替换的方法来实现构造sql语句。

String sql = ("insert into score values(?,?,?,?)");

这里的“?”就是占位符,相当于告诉编译器这里有数据具体是我们还不确定先占个位置,之后再使用setInt()来将占位符替换成我们想插入的数据。

 String sql = ("insert into score values(?,?,?,?)");PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,name);preparedStatement.setInt(2,Chinese);preparedStatement.setInt(3,English);preparedStatement.setInt(4,math);

setInt()的第一个参数对应的数字就对应上述sql语句中第几个占位符,1就对应第一个占位符,2就对应第二个占位符,后一个参数就是我们要替换的数据。

 运行结果

可以看到运行结果和之前一样,依旧可以成功的插入数据。

执行查找语句

查找语句和插入语句有所不同,查找语句不需要我们输入数据,而是需要获得一个查找后的结果集,这里你是否有印象刚刚再介绍“执行sql语句”时有提到executeQuery()方法,该方法执行后会返回查询到的单个结果集。

 但是我们要注意,executeQuery();的返回值是resultSet类型,那么resulSet是什么?

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供 了对这些行中数据的访问。 ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当 前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next() 方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

 具体操作如下

 String sql = ("select * from score");PreparedStatement statement = connection.prepareStatement(sql);//executeQuery();的返回值是resultSet类型//ResultSet是查询的结果集合(临时表),此处就需要对结果集合进行遍历ResultSet resultSet = statement.executeQuery();while(resultSet.next()){int name = resultSet.getInt("name");int Chinese = resultSet.getInt("Chinese");int English = resultSet.getInt("English");int math = resultSet.getInt("math");System.out.println("name:" + name +" Chinese:" + Chinese +" English" + English +" math:" + math);}resultSet.close();statement.close();connection.close();

//通过next就可以获得临时表中的每一行数据,如果到了最后一行再执行,next就会返回fasle

//我们刚刚还有提到executeQuery()方法返回的是单个的结果集,换句话说就是一次只能查询一行,所以要使用循环

运行代码

和我们直接操作数据库的结果集一样

执行删除语句

执行删除语句的方法和前面一样,这里我们根据name来进行条件筛选

  Scanner scanner = new Scanner(System.in);System.out.println("请输入名字");int name = scanner.nextInt();String sql = ("delete from score where name = ?");PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,name);

执行结果

可以发现我们刚刚插入的一条数据已经被删除了

执行修改语句

修改语句的执行方法和前面几乎类似,这里我是以name作为条件筛选,来修改math

   Scanner scanner = new Scanner(System.in);System.out.println("请输入名字");int name = scanner.nextInt();System.out.println("请输入数学成绩");int math = scanner.nextInt();String sql = ("update score set math = ? where name = ?");PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,math);preparedStatement.setInt(2,name);

 //注意占位符的先后顺序

执行结果

可以看到数据已经发生改变,说明我们已经成功修改


JDBC的优缺点

优点:

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限定在特定数据库厂商的API
  • 程序的可移植性大大增强
  • JDBC是Java数据库连接的标准API,所有JDBC驱动都遵勖这个标准
  • 可以使用面向对象的方式操作数据库

缺点:

  • 需要处理可能发生的SQLException。

  • 直接使用JDBC操作数据库可能会导致代码冗余,不易维护。

  • 对结果集的解析较为复杂,需要手动解析。

练习--使用JDBC实现记账溥

为了可以对JDBC的使用更加熟练,博主这里准备了一个小练习,来对刚刚讲的使用方法进行巩固

使用JDBC做一个记账溥,可以实现将日常的收入/支出账单存储再我们的数据库中

具体思路博主这里就不展示了,实现结果如何其实无所谓(写这个代码目的只是为了巩固JDBC的使用方法)

以上就是博主对mysql--JDBC编程的分享,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰

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

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

相关文章

【Python】从基础到进阶(三):深入了解Python中的运算符与表达式

🔥 个人主页:空白诗 文章目录 一、引言二、运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符 三、表达式1. 表达式的定义2. 运算符的优先级3. 使用括号提升可读性4. 组合运算符与复合表达式 四、案例:计…

微信管理神器能解决哪些问题?

1、为了自身利益,销售离职单独干(带走客户) 企业的客户都被销售带走了,那企业会遭到一定的损失,客户的资源是非常保密或重要的。 2、销售客户难以统计,不知道销售整体在干啥(没有统计&#xf…

redis学习(009 实战:黑马点评:缓存穿透、缓存雪崩 、缓存击穿)

黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第40p-第p45的内容 文章目录 缓存穿透解决方案缓存空对象布隆过滤 解决方案实现缓存穿透总结 缓存雪崩解决方案 缓存击穿解决方…

Codeforces Round 957 (Div.3)

传送门 A. Only Pluses 时间限制:1秒 空间限制:256MB 输入:标准输入 输出:标准输出 问题描述 Kmes 写下了三个整数 a、b 和 c,以记住他要给 Noobish_Monk 的香蕉数量是 a b c。 Noobish_M…

vue3<script setup>自定义指令

main.ts // 自定义指令 app.directive(color,(el,binding) > {el.style.color binding.value })这段代码定义了一个名为color的自定义指令,并将其注册到Vue应用实例app上。自定义指令接收两个参数:el和binding。el是绑定指令的元素,而bi…

Ubuntu22.04安装NIVIDIA显卡驱动总结

1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章: https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…

【C++】函数重载详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

【LLM大模型】Langchain 介绍与入门

官方介绍 LangChain 是一个利用LLM开发应用程序的框架。它让应用程序具备: 上下文感知能力:将LLM连接到上下文源(提示说明、少量示例、用以形成其响应的内容等)推理:依靠LLM进行推理(例如根据提供的上下文…

全网最详细单细胞保姆级分析教程

各位读者,好久不见,我又归来了,之后的一段时候我将以Rstudio分析单细胞的RNA-seq流程为主,希望各位读者朋友多多支持! 1. pbmc单样本分析 1.包的加载 library(multtest) library(dplyr) library(Seurat) library(patchwork) library(R.utils)2. 清除环境变量 rm(list ls))…

深度解析蚂蚁 SEO 蜘蛛池:提升网站流量的有效利器

在当今数字化时代,网站流量对于企业和个人的在线业务成功至关重要。为了在竞争激烈的网络环境中脱颖而出,众多站长和 SEO 从业者不断探索各种优化策略,其中蚂蚁 SEO 的蜘蛛池成为备受关注的工具之一。 蚂蚁 SEO 蜘蛛池是一种创新的技术手段&a…

HarmonyOS鸿蒙开发入门 , ArkTS语言的了解

鸿蒙(即HarmonyOS,开发代号Ark,正式名称为华为终端鸿蒙智能设备操作系统软件)是由华为公司2012年以来开发的分布式操作系统,并于2019年8月正式发布。该系统利用“分布式”技术,将手机、电脑、平板、电视、汽…

画封装步骤

parameter参数 1.打开pad designer 2.设计单位mils改为millimeter,保留decimal layers 3.勾选☑️single layer mode

游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程

前言: 游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程 以下软件操作教程以,佳易王游戏厅电玩店计时计费管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件操作教程 1、计…

【Python】人生重开模拟器(实现代码)

一、游戏背景介绍 这是一款文字类小游戏。玩家输入角色的初始属性之后,就可以开启不同的人生经历。 完整的程序代码较多,此这里只实现其中的一部分逻辑(主要目的:巩固前面学习的 Python 语法基础)。 二、设置初始属性…

springboot企业人力资源管理系统-计算机毕业设计源码29005

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

Redis 主从复制,哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式(Sentinel) 1.主要组件和概念 2.哨…

基于复旦微V7 690T FPGA +ARM/海光X86+AI的全国产化数据采集人工智能平台

国产化FPGA:JFM7VX690T80主机接口:PCIe Gen3 x88Gbps/lane光纤通道:前面板4路SFP光纤,后面板1路QSFP光纤2组独立的DDR3 SDRAM 缓存,工作时钟频率800MHz2个FMC接口扩展:每个支持16路GTH,线速率10…

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…

ORB-slam3 安装教程

1. 官网下载源码:GitHub - UZ-SLAMLab/ORB_SLAM3: ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM 2. 根据官网下载依赖: (1)eigen3:Eigen 解压后进入源码目录进行编译&#xff1a…

ensp实验:防火墙安全策略用户认证综合策略

实验要求: 示例图: 设备配置: LSW5 vlan配置: 防火墙网络配置: 安全区域配置: 地址组配置: 时钟配置: 一: 办公区策略: 生产区策略: 二: 游客区…