【从删库到跑路 | MySQL数据库总结篇】JDBC编程

news2024/12/27 17:17:20

在这里插入图片描述

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【MySQL学习专栏】🎈
本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、前言
  • 二、导入MySQL驱动包
    • 如何下载MySQL驱动包
    • 如何向项目中导入MySQL驱动包
  • 三、JDBC编程
    • 创建数据源
    • 与数据库服务器建连接
    • 构造SQL语句
    • 执行SQL语句
    • 释放必要资源,关闭连接
    • 向数据库中插入数据完整代码
    • 查询数据库中的数据完整代码
  • 四、JDBC编程注意事项

一、前言

JDBC编程(Java Database Connectivity)简单来说就是通过JAVA代码来操作数据库。我们在绝大部分的实际开发过程中,都是通过代码来操作数据库的(既然想用代码来操作数据库的话最主要的还是依赖我们之前学过的SQL语句)。

首先我们要知道,一个成熟的数据库一般都会提供API(Application Programming Interface,叫做应用程序编程接口)来供开发者使用,API就是一些类/方法。API是一个非常广义的概念,这与我们之前JAVA语法中学到的Interface接口是有所区别的。
Java语法中的Interface接口特指的是Java语法中的特殊语法格式(Interface算是一个非常狭义的概念)。实际上,Java中的Interface接口也是提供API的一种方式。

通常我们写好一个程序之后,这个程序要给别人提供哪些功能,这些功能往往是通过函数/类这样的方式来提供的。
比如,我们之前Java语法阶段学过的RandomScannerArrayListString等这些都可以认为是Java标准库为我们提供的API

每个数据库提供的API都是不一样的。例如MySQL中有MySQL数据库提供的数据库、Oracle中有Oracle数据库提供的API、SQLServe数据库中有SQLServe提供的API、SQLite数据库中有SQLite数据库提供的API。又因为设计每个数据库的人都是不一样的。所以每个数据库设计出来的API差异很大。这也会大大增加开发者的学习成本。
此时,java就提供了一套操作数据库的API,这个API存在的意义就是可以让所有的数据库都能按照统一的方式来进行操作使用数据库。所以开发者只需要学会一套API就可以操作各种数据库了。(然而这只是针对Java开发者而言)
对于C++开发者而言的话就没有这么方便了,我们已经知道每个数据库都有自己的一套API,一些比较大的公司为了让C++开发者更加方便的操作数据库也尝试开发出一套统一的API,但是开发出来的统一API也是有很多套的,导致这些不同公司或者组织开发出来的不同的统一API谁也不服谁,知道现在,也没有哪一套统一API能够向JDBC可以操作各种数据库。

好了,现在我们把关注点放到JDBC上面,我们已经知道JDBC提供了统一的一套API来供Java开发者来操作各种数据库,但是我们不要忘记每一个数据库本身都是有自己的一套API的(JDBC只是把这些API进行统一成了一套API)。所以每个数据库厂商就提供了一些代码(这些代码就称为数据库的驱动包)来把数据库自己的原生API转换为JDBC的统一API。请看下图方便大家理解:
在这里插入图片描述

在这里插入图片描述

二、导入MySQL驱动包

如何下载MySQL驱动包

现在我们需要引入MySQL的驱动包,来作为项目的依赖,即把MySQL驱动包下载下来导入到项目中。

关于MySQL驱动包下载的方法有很多种,我们这里采取的是从中央仓库中进行下载,中央仓库网址:https://mvnrepository.com/

现在我们进行下载的演示:
在这里插入图片描述
然后选择自己所需要的版本即可(数据库驱动包的版本和数据库服务器的大版本必须保持一致,小版本的话不做要求):
在这里插入图片描述
我这里下载的是5.1.49版本的:
在这里插入图片描述
下载成功之后大概长这个样子:
在这里插入图片描述
这就算是MySQL驱动包下载好了。

我们来解释一下下载的这个jar包是个什么东西:
.jar类似于是.rar这样的压缩包,是java定义的一种压缩格式,.jar包中包含了很多的.class文件
那那么多的.class文件是干什么用的呢:一般我们要想把程序发布给其它人的话,就需要把这些.class文件拷贝过去,而如果.class文件特别多的话,就显得非常的麻烦,所以我们一般就会把这些.class文件打成压缩包的形式,即打成java定义的一种压缩格式,即.jar格式

如何向项目中导入MySQL驱动包

现在我们已经有了MySQL驱动包,接下来我们看看如何来将其导入到我们的项目中。

首先我们在项目中新创建一个目录,取名叫liblib即library,在计算机中就是库的意思):
在这里插入图片描述
在这里插入图片描述
然后我们ctrl+c复制一下刚刚的.jar包,然后ctrl+v粘贴到lib目录中去,请看:
在这里插入图片描述
最后一步:右键lib目录,然后点击Add as Library(点击之后会弹出来一个小弹窗,我们点击OK即可),这一步意思就是告诉idea这个lib目录中放的是库文件(即.jar包
在这里插入图片描述

三、JDBC编程

创建数据源

关键代码1:DataSource dataSource = new MysqlDataSource();

解释: DataSource dataSource = new MysqlDataSource();
DataSourceJDBC提供的interfaceMysqlDataSource()是MySQL驱动包提供的类,这个类就实现了JDBC提供的interface(即DataSource)
DataSource dataSource = new MysqlDataSource();是一个向上转型(父类引用指向子类对象)的操作。

关键代码2:((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/mysql_java?characterEncoding=utf8&useSSL=false");

解释,此代码就是向下转型,目的就是使用setUrl()方法,这个方法是子类才有的。

好了,现在我们如果既不是用向上转型也不使用向下转型,我们就可以把关键代码1和关键代码2一起改为:MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/mysql_java?characterEncoding=utf8&useSSL=false");,这种写法(不使用转型)完全是可以的。我们之所以使用关键代码1和关键代码2这种转型的写法就是希望MysqlDataSource这个类不要扩散到代码的其它部分,即目的就是想mysql驱动包和项目代码之间的耦合关系,避免以后更换数据库的时候有太大的成本。或者当我们写的代码比较简单的时候,其实不需要太在意耦不耦合的事项,所以这两种方式在代码比较简单的时候无论用哪种方式都是可以的。我们这里使用关键代码1和关键代码2的这一种方式。

url是什么:url是唯一资源定位符,通常用来描述url来描述网络上一个资源的位置。而MySQL本体是一个服务器,相当于网络上的一个资源。

现在我们来看看setUrl()方法中"jdbc:mysql://127.0.0.1:3306/mysql_java?characterEncoding=utf8&useSSL=false"是什么:

  • jdbc:mysqljdbc:mysql意思就是给jdbc中的mysql用的。
  • 127.0.0.1是一个ip地址,相当于网路上一个设备的地址(网络上的ip地址通常是使用来进行表示的一串数字,每个部分的数值范围是1到255,用.进行分割)而127.0.0.1(环回地址)这个ip地址是一个比较特殊的ip地址,特指我们自己电脑的主机。如果我们的数据库和java代码都是在同一个主机上进行执行的,那么我们这里的ip地址就可以把ip地址写成环回ip(即127.0.0.1)。
  • 33063306是一个端口号,是用来区分主机上的应用程序的。比如,我的电脑上此时正在运行着许多的应用程序,即是用来区分应用程序上的进程的。
  • characterEncoding=utf8统一字符集为utf8
  • useSSL=false决定了数据库服务器和客户端之间的通信是否要进行加密。

设置了url之后,我们还需要设置用户名和密码。代码如下:
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("111111");

至此,我们只是找到了数据库服务器的地址,并没有连接上数据库服务器。

与数据库服务器建连接

现在,我们来尝试连接数据库。

输入代码1: Connection connection = dataSource.getConnection();

注意:我们输入Connection的时候必须选择第二个,即java.sql
在这里插入图片描述
同时,我们可以注意到,上面代码抛出了异常(分为受查异常和非受查异常。其中受查异常必须经过我们的手动处理,即要么try catch,要么throws
我们再来看上述代码抛出的异常(java.sql.SQLExceptionjdbc中提供的受查异常),按住alt+enter可以抛出异常。
一个java程序,可以连接多个数据库服务器。和每个数据库服务器进行通信都要有独立的连接、通讯。

构造SQL语句

假设我们现在有一张student(id,name)的学生表,现在向表中进行插入数据。在这里插入图片描述

关键代码:String sql = "insert into student values(1,'张三')";PreparedStatement statement = connection.prepareStatement(sql);

在这里插入图片描述
上图中我们选择java.sql库中的PreparedStatement

解释:PreparedStatement statement = connection.prepareStatement(sql);
首先我们知道SQL语句是string类型,JDBC提供了Statement(中文是语句的意思)对象让我们把string类型转换为Statement然后再发送给服务器。
但是我们一般会使用PreparedStatement(预处理的语句)对象来替代Statement
之所以会使用PreparedStatement来代替Statement是因为Statement对象会把SQL语句原封不动的直接发给数据库服务器,此时数据库服务器只能自己来解析SQL语句。
PreparedStatement对象回先在客户端这边初步解析一下SQL语句(验证语法格式是否符合要求啥的),此时数据库服务器就不需要再做这些检查了,从而降低了数据库服务器的负担。

执行SQL语句

输入代码:int n = statement.executeUpdate();
在这里插入图片描述

释放必要资源,关闭连接

输入代码:statement.close(); connection.close();

解释:
我们创建的语句对象连接对象中一般都会持有计算机硬件或者软件上的资源,这些资源我们如果不使用的话就需要及时进行释放。
在Java中虽然有垃圾回收机制来自动释放内存,但是计算机资源中不仅仅包含了内存资源,还包含了一些其它的资源。这些其它的资源(如连接对象中会包含出来内存资源以外的其它计算机资源)就需要我们进行手动释放。
所以我们一般使用close()方法,即一个专门释放资源的方法。
还有一点我们需要注意:先创建的对象后关闭,即后创建的对象先关闭。

最终运行结果如下:
在这里插入图片描述

向数据库中插入数据完整代码

import javax.sql.DataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCDemo1 {

    public static void main(String[] args) throws SQLException {
        // 创建数据源头
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/mysql_java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("111111");

        // 连接数据库
        Connection connection = dataSource.getConnection();

        // 构造SQL语句
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 执行SQL语句,返回值代表此次操作影响到了几行
        int n = statement.executeUpdate();
        System.out.println("n = " + n);

        // 释放没有必要资源,关闭连接
        statement.close();
        connection.close();
    }
}

如果我们希望插入的数据能够在运行是发生动态的变化,这种方式当然是可以的;但是我们不希望你这样做,因为那样会使你的代码显得并没有那么整洁。另外拼接字符串的方式也并不是那么的安全。
在这里插入图片描述
如果我们想要让插入的数据通过控制台发生动态的变化的话,PreparedStatement给我们提供了更为方便的方式(基于占位符的一种方式)比如String sql = "insert into student values(?,?)";
其中,?是一个占位符,即会占据一个位置,后续PreparedStatement会把变量值带入到?中。
替换方式如下:
在这里插入图片描述
上图中代码的写法就会显得代码肥肠粉简单明了。同时在执行过程中,setXXX()方法内部也会进行更为严格的校验(避免出现SQL注入攻击的情况)。

对数据库进行删除操作:
在这里插入图片描述

查询数据库中的数据完整代码

对数据库进行查询操作:
关键代码1:ResultSet resultSet = statement.executeQuery();

关键代码2(遍历查询结果集合):

while(resultSet.next())
{
	int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("id = " + id + ", name = " + name);
}

完整代码如下:

// 查询操作
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCDemo3 {
    public static void main(String[] args) throws SQLException {
        // 创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/mysql_java?characterEncoding=utf8&uesSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
        // 与数据库建立连接
        Connection connection = dataSource.getConnection();
        // 构造数据库语句
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        // 执行SQL语句
        ResultSet resultSet = statement.executeQuery();
        // 遍历查询结果集合
        while(resultSet.next())
        {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id = " + id + ", name = " + name);
        }
        // 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

查询结果如下:
在这里插入图片描述

如果我们要查询某一个学号的学生,请看:
在这里插入图片描述
查询结果如下:
在这里插入图片描述

另外要注意执行查询操作时要使用executeQuery()方法。查询操作返回值是一个ResultSet类型的对象来表示是一个表格。(需要我们遍历查询的结果)。

四、JDBC编程注意事项

  • 创建数据库连接时,Connection选择java.sql库中的Connection
  • 创建数据库时不要忘记抛出异常
  • 与数据库建立连接时(Connection connection = dataSource.getConnection();)不要忘记抛出异常(alt+回车)
  • 准备执行SQL语句的PreparedStatement对象使用的是java.sql包中的PreparedStatement

JDBC编程最主要的四个API:

  • DataSource
  • Connection
  • PreparedStatement
  • ResultSet(遍历查询结果)

通过上面最主要的4个API,就可以完成JDBC编程。这里并不是太难,但是需要我们经常的去进行练习。

好了,以上就是本文的全部内容了,希望大家多多练习,加强自己的理解。就到这里吧,再见啦友友们!!!
在这里插入图片描述

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

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

相关文章

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表,pending表,handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间(第三次)用户态和内核态sigaction可重入函数volat…

技术博客:Vue中各种混淆用法汇总

​ 摘要 本文主要介绍了在Vue中使用的一些常见混淆用法,包括new Vue()、export default {}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等,以及如何使用混淆器对代码进行加固,保护应用安全。 引言 在Vue开发中,…

java小工具util系列3:JSON转实体类对象工具

文章目录 准备工作1.JSONObject获取所有的key2.集合中实体对象转换 list中Enrey转Dto3.字符串转List<BusyTimeIndicatorAlarmThreshold>4.json字符串转JSONObject5.list根据ids数组过滤list6.json字符串转JavaBean对象7.json对象转javabean8.jsonObject转map9.List\<U…

007:vue实现与iframe实现页面数据通信

首页先搭建一个html页面和vue页面&#xff0c;在vue页面中&#xff0c;嵌入我们需要的iframe页面 文章目录 1. 搭建 html 页面和 vue 页面2. 实现 iframe 向 vue 页面通信3. 在实现 vue 向 iframe 页面通信 1. 搭建 html 页面和 vue 页面 暂定为 iframeDemo.html 和 vueDemo.v…

电子版简历模板精选5篇

电子版简历模板模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;做好简历&#xff0c;来幻主简历。 电子版简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;ERP咨询顾问 意向城市&#xff1a;北京市 薪资要求&#xff1a;…

Vue 应用程序性能优化:代码压缩、加密和混淆配置详解

简介 在 Vue 应用程序的开发中&#xff0c;代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。 Vue CLI 是一个功能强大的开发工具&#xff0c;它提供了方便的配置选项来实现这些功能。本文将介绍如何使用 Vue CLI 配置代码压缩、加密和混淆功能&#xff0c;以提…

【矩阵论】Chapter 6—矩阵分解知识点总结复习(附Python实现)

文章目录 1 满秩分解&#xff08;Full-Rank Factorization&#xff09;2 三角分解&#xff08;Triangular Factorization&#xff09;3 正交三角分解&#xff08;QR Factorization&#xff09;4 奇异值分解&#xff08;SVD&#xff09; 1 满秩分解&#xff08;Full-Rank Factor…

【数电笔记】07-基本和复合逻辑运算

目录 说明&#xff1a; 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运算&#xff08;nor&…

【python】保存excel

正确安装了pandas和openpyxl库。 可以通过在命令行中输入以下命令来检查&#xff1a; pip show pandas pip show openpyxl 可以使用pip安装 pip install pandas pip install openpyxl#更新 pip install --upgrade pandas pip install --upgrade openpyxl 保存excel …

抖店怎么对接达人带货?达人渠道整理,实操详解!

我是电商珠珠 很多人在抖店开通后&#xff0c;按照流程去正常的跑自然流量&#xff0c;再去找达人带货让自己店铺的流量增多&#xff0c;得到相应的曝光。 但是一些新手小白并不知道从哪去找达人&#xff0c;或者说不知道怎么去筛选达人。 一开始所有人都想着去找头部主播&a…

Deep Learning(wu--84)调参、正则化、优化--改进深度神经网络

文章目录 2偏差和方差正则化梯度消失\爆炸权重初始化导数计算梯度检验OptimizationMini-Batch 梯度下降法指数加权平均偏差修正RMSpropAdam学习率衰减局部最优问题 调参BNsoftmax framework 2 偏差和方差 唔&#xff0c;这部分在机器学习里讲的更好点 训练集误差大&#xff…

matplotlib 默认属性和绘图风格

matplotlib 默认属性 一、绘图风格1. 绘制叠加折线图2. Solarize_Light23. _classic_test_patch4. _mpl-gallery5. _mpl-gallery-nogrid6. bmh7. classic8. fivethirtyeight9. ggplot10. grayscale11. seaborn12. seaborn-bright13. seaborn-colorblind14. seaborn-dark15. sea…

kyuubi整合flink yarn session mode

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catlogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 配置 ky…

C# 通俗讲解Public、Private以及Protected、[HideInInspector]、[SerializeField]的区别

一、故事背景 1.我画了一幅画&#xff0c;把它放在室外&#xff0c;所有人都可以看见这个画&#xff0c;所有人都可以对这个画进行修改。 2.我非常非常努力&#xff0c;赚了一大笔钱&#xff0c;这笔钱&#xff0c;只能我和我的子孙后代用&#xff0c;但如果我的孩子需要传给他…

unity旋转选中效果

代码和预制体 函数PlayAnim&#xff08;&#xff09;中的角度要根据按钮数量手动填好 using System; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using UnityEngine;// Token: 0x0200001B RID: 27 public class BtnParentScript : Base…

24、pytest通过xfail将测试函数标记为预期失败

官方实例 # content of test_xfail.py import pytest import syspytest.mark.xfail def test_function():print("test_function was invoked.")def valid_config():return Falsedef test_function_02():if not valid_config():pytest.xfail("failing configura…

JVM 虚拟机(一)导学与字节码文件组成

一、实战 JVM - 基础篇 初识 JVM 什么是 JVM&#xff1f; Java Virtual Machine&#xff08;JVM&#xff09;&#xff0c;中文翻译为 Java 虚拟机 JVM 的功能 解释和运行&#xff1a;对字节码文件中的指令进行实施的解释成机器码&#xff0c;让计算机执行。自动为对象和方法…

PyTorch机器学习与深度学习实践技术应用

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…

不会代码(零基础)学语音开发(语音播报板载双按键状态)

这个例程实现语音播报VDB-150S语音开发板板载的按键开关SW1、SW2的按下情况。 语音开发板将板载的按键开关SW1、SW2的一端都接到了GND端&#xff0c;另一端分别连接到语音模块的GPIO_B0、GPIO_B1引脚&#xff0c;当按下SW1时GPIO_B0引脚会输入低电平&#xff0c;当按下SW2时GP…

Hadoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …