《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编程的分享,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰
相关文章:

《mysql篇》--JDBC编程
JDBC是什么 JDBC就是Java DataBase Connectivity的缩写,翻译过来就很好理解了,就是java连接数据库。所以顾名思义,JDBC就是一种用于执行SQL语句的JavaApl,是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库ÿ…...

android studio 怎么下载 buildTool
在Android Studio中下载Build Tools,通常可以通过Android Studio内置的SDK Manager来完成。以下是详细的步骤: 一、通过Android Studio的SDK Manager下载Build Tools 启动Android Studio:首先,确保你已经安装了Android Studio&am…...

copy 和 mutableCopy 有点乱
字符串的拷贝操作 对 string literal (字符串字面量) 执行 copy 要打印指针指向对象的地址和指针本身的地址,可以使用 %p 格式符来输出指针地址。以下代码,展示了 originalString 和 copiedString 的指针地址和指向对象的地址: NSString *…...

sqlalchemy通过查询参数生成query
sqlalchemy通过查询参数生成query 在SQLAlchemy中,可以使用查询参数来动态生成查询。这通常通过使用.filter()方法和Python的比较运算符来实现。以下是一个简单的示例,展示如何使用查询参数生成查询: 假设我们有一个名为User的模型(表),它具有id、username和email字段。…...

【JavaScript 算法】二分查找:快速定位目标元素
🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 二分查找(Binary Search)是一种高效的查找算法,适用于在有序数组中快速定位目标元素。相比于线性查找,二分查找…...

论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer
目录 摘要 介绍 方法 VIT-V-Net体系结构 损失函数 图像相似性度量 变形场正则化 结果与讨论 摘要 在过去的十年里,卷积神经网络(ConvNets)在各种医学成像应用中占据了主导地位并取得了最先进的性能。然而,由于缺乏对图像中远程空间关系的理解&a…...

C++入门到进阶(图文详解,持续更新中)
C入门到进阶(图文详解,持续更新中) 详解C入门知识到进阶,配合图观看易于理解记录 文章目录 目录 C入门到进阶(图文详解,持续更新中) 文章目录 前言 一、数据 (一)数据类…...

【React Hooks原理 - useRef】
概述 在Function Component项目中当我们需要操作dom的时候,第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已,为了更好的学习React Hooks内部实现原理,知其所以然。所以本文根据源码从useRef的基础使用场景一…...

MVC之 IHttpModule管道模型《二》
》》》注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。 HTTP Modules ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,当请求到达HttpMod…...

2025上海纺织助剂展会+上海织物整理剂展
2025上海纺织助剂展会上海织物整理剂展 2025第十二届中国(上海)纺织助剂及织物整理剂展览会 时间: 2025年4月23-25日 地点:上海跨国采购会展中心(光复西路2739号) 展会简介: 2025第12届中国(上海&#…...

中科亿海微亮相慕尼黑上海电子展
7月8-10日,备受瞩目的全球电子行业盛会“慕尼黑上海电子展”以空前规模启幕,汇聚了超过1600家参展企业,涵盖了从终端产品制造商到元器件供应商、组装/系统供应商、EMS、ODM/OEM、材料供应商及生产设备供应商的完整产业链。中科亿海微电子科技…...

Spring boot 2.0 升级到 3.3.1 的相关问题 (一)
文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 (一)拦截器Interceptor的变动问题介绍解决方案 WebMvcConfigurerAdapter 自定义Mvc配置问题介绍解决方案 Spring boot 2.0 升级到 3.3.1 的相关问题 (一) 拦截器Interceptor的…...

数据分析——Python网络爬虫(四){爬虫库的使用}
爬虫库 爬虫的步骤urllib库发送请求两种方法案例 爬虫的步骤 #mermaid-svg-h5azjtPInpsU2ZpP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-h5azjtPInpsU2ZpP .error-icon{fill:#552222;}#mermaid-svg-h5azjtPInps…...

C++客户端Qt开发——信号和槽
三、信号和槽 1.信号和槽概述 在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮”是一个事件,"用户关闭窗口”也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号&…...

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...

微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

学习大数据DAY16 PLSQL基础语法5
目录 异常 自定义异常的格式 raise_application_error 处理异常 预定义异常 SQLcode和SQLerrm 非预定义异常 作业 触发器 触发器基本概念 DML触发器 DML触发器使用 instead of 触发器 管理触发器 作业2 函数、过程和包 函数 过程 参数 1. in 参数 2.out 参…...

LabVIEW心电信号自动测试系统
开发了一种基于LabVIEW的心电信号自动测试系统,通过LabVIEW开发的上位机软件,实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块,能够高效、准确地完成心电信号的测量与分析。 硬件系统…...

最值得推荐的10款Windows软件!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频播放量破百万https://aitools.jurilu.com/1.音乐播放器——Dopamine Dopamine是一款音乐播放器,设计简洁美观。它支持多种音频格式,包括wav、mp3、ogg…...

游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
游戏视频后期配音是先配还是先剪?游戏视频后期配音没有统一的准则,可以先配,也可以后配,主要是根据内容而定。游戏视频剪辑在游戏玩家中十分流行,那么,游戏视频怎么剪辑制作?下面让我们以具体的…...

配置 Node.js 内存限制
配置 Node.js 内存限制 Node.js 应用程序通常需要配置堆内存的大小以优化性能和避免内存溢出问题。你可以通过命令行参数、环境变量或系统属性来设置 Node.js 的内存限制。下面将分别介绍在 Windows、Linux 和 macOS 系统下的配置方法。 Windows 系统 1. 命令行参数方式 在…...

ORA-12518: TNS: 监听程序无法分发客户机连接
ORA-12518: TNS: 监听程序无法分发客户机连接 OracleService 服务停止了,启动就好了...

2.5 计算机网络
声明:文章参考的《系统架构设计师教程(第二版)》,如有侵权,本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件以及通信协议实现…...

同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器 同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清…...

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle
FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍,方便大家对比:(产品更新详情:…...

vue 前端项目调用后端接口记录
axios中不同的类型的请求附带数据使用的关键字 请求类型关键字示例GETparamsaxios({ method: get, url: example.com, params: { key: value } })POSTdataaxios({ method: post, url: example.com, data: { key: value } })PUTdataaxios({ method: put, url: example.com, dat…...

4.10、matlab生成脉冲序列:pulstran()函数
1、matlab生成脉冲序列简介 MATLAB生成脉冲序列通常涉及到使用MATLAB中的函数或编程来创建具有特定时间间隔和幅度的脉冲信号。脉冲序列通常用于数字信号处理、通信系统测试等应用中。 生成脉冲序列可以采用以下方法之一: 使用MATLAB中的函数,例如square()函数生成方波信号…...

【JAVA poi-tl-ext 富文本转word】
富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…...

uniapp 小程序注册全局弹窗组件(无需引入,无需写标签)
由于uniapp没有开放根节点,所以一般情况下通过app.components注册,在需要的页面直接写组件标签,但是如果每个页面都需要的话,再每个都加的话会非常的麻烦 网上的思路都不咋地: 1.通过写一个透明弹窗页面来实现&#…...

python 语法学习 day 7
错题反思 1.九九乘法表 第一次提交的答案是:先把所有输入值放在列表里面 EOF,输入后产生异常-->>捕获异常,结束输入 3. 题意:统计单词的种类以及数量(忽略大小写),最终以降序输出(出现次数相同的单词根据单词的…...