如何实现Java的JDBC编程(基本概念,驱动包安装)

2023-11-09

Java的JDBC编程

1 概念

何为 JDBC编程

就是通过Java代码来操作数据库

咱们学数据库,无论是命令行 还是图形化界面,都不是开发中的主流使用方式

通过代码操作数据库,才是正真主流的方式

但无论是哪种方式,核心知识都是SQL

image-20220716200104711

像我们的一些主流数据库,为了方便程序猿实现客户端程序,会提供一些 API 接口,称为“数据库SDK”,我们可以借助这些API比较方便地访问数据库服务器

  • API是计算机中一个非常广泛使用的术语,也就是提供了一些类/方法/函数,可以让程序猿直接调用来完成一些功能
  • SDk也是计算机中一个非常广泛使用的术语,指软件开发工具包,提供了一些工具

由于API是数据库提供的,所以不同的数据库,提供的API站的可能都不一样

image-20220716201351891

我们希望有一个统一的标准,于是Java就提供了一套标准的接口体系,让这些数据厂商,提供得到API都往Java的这套接口体系中适配

程序员就只需要掌握Java的这一套API即可适应所有常见的主流数据库了

Java的这套操作数据库 的API,就称为 JDBC

各个数据库厂商,为了能够适配 JDBC
因此就需要写一些额外的程序来完成这个工作.厂商提供的这套额外的程序,称为"JDBC驱动包"使用Java操作各种数据库,就需要安装对应数据库提供的驱动包,才能真正进行使用

JDBC本质上就是Java对于各种数据库差异性的封装,目的就是为了简化程序猿的学习使用成本 !

2 安装驱动包

首先需要先有驱动包

从哪里去找驱动包?

  1. MySQL官网 (Oracle收购) 不太容易
  2. 中央仓库,驱动包也是一种"第三方库" 。第三方库有很多,就有大佬,把各种第三方库收集起来,放到一个统一的网站上。

下面介绍一个仓库

[/Maven Repository仓库](Maven Repository: Search/Browse/Explore (mvnrepository.com))

image-20220716213550326

找到这个

image-20220716213611083

在版本列表中选择5系列的版本(5.1.49,5.1.47这些都可以)要和 你的数据库服务器版本匹配,数据库是mysql8,就用8.0系列

是5就用5系列

image-20220716233222334

选择一个版本,点进去

image-20220716233452315

然后就开始下载了

image-20220716233617699

下载好之后,就得到了一个 .jar 后缀的文件,叫做jar包,本质上就是一个类似于rar的压缩包

( Java发布程序给别人使用的时候,也会经常打jar包,jar包里主要就是一些 .class 文件)

image-20220716234001769

然后用解压软件打开

image-20220716234110648

像这样的压缩包,不需要手动解压缩,直接放到项目中即可,JVM在运行的时候就能自动读取压缩包内部的内容

新建一个目录,然后把刚刚的 jar包拷贝到这个目录里

image-20220716234706007 image-20220716234803869

然后就会变成这样

image-20220716234833349

右键,找到 add as library

image-20220716234910887

直接点OK

image-20220716235108007

然后,这个jar包就能被idea识别了!
image-20220716235141207

3 实现JDBC编程

接下来,就可以进行代码的编写了

要操作数据库,就得连接上数据库服务器,要想连上数据库服务器,就得描述清楚服务器所在的位置

在JDBC里面,使用DataSource这类来描述数据库的位置

image-20220716235956902

这个操作,就是向上转型

用一个父类引用指向子类的实例

image-20220717000314168

这个操作,就是向下转型

当然,上面两步操作就等价于这一步

image-20220717000452240

虽然两种写法没啥区别.但是实际开发中可能还是更多的看到第一种写法!!

**第一种写法**里,得到的数据源是==DataSource类型==.

后续写其他代码,方法/类,如果使用到数据源,持有的类型也是DataSource类型。

DataSource是通用的类型,可以代指任何数据库。未来一旦需要更换数据库,代码改动是非常小的,只需要把实例化这一小块代码改了即可,其他代码都不用变。

第二种写法,得到的数据源是==MysqIDataSource类型==。

后续的其他代码,方法/类,如果用到数据源,持有的类型也就是MysqlDataSource

MysqIDataSource只是针对MySQL的类型.

未来一旦更换数据库,可能就需要把散落在代码各个地方的MysqIDataSource类型进行修改.

  • 这也是咱们所学习的"多态"的重大的意义
  • 多态本质其实就是对于"封装"的更进一步
  • "封装"是为了让程序猿不必了解太多的实现细节,就能直接使用,从而降低使用成本.
  • "多态"就是更进一步, 不光程序猿不必了解细节了,而且甚至于连这个对象是啥类型都可以不必关心了.更进一步的降低了使用成本~~

第一步我们要做的就是通过DataSource来确定服务器的位置~~

那么位置如何描述?

描述一个网络上的资源,常用手段,就是使用URL (唯一资源定位符/网址)

 DataSource dataSource = new MysqlDataSource();
   ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");

这一长串就是我们的URL

下面我们对它简单的解析一下,看看它其中都隐藏的那些信息??

image-20220717010338472

向上述URL,我们不必要去背!

背,是很容易背错的,写了一次之后,后续只要复制粘贴即可

//1. 使用 DataSource 描述 MySQL 服务器的位置
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("******");

image-20220717011255308

以上操作,就描述了数据库的位置

  • IP地址
  • 端口号
  • 数据库名
  • 用户名
  • 密码

第二步,就是和数据库服务器建立连接

在网络通信中,有两种风格,

一种是 “ 有连接 ”,相当于“ 打电话 ”,必须要电话拨通了(连接建立上了),两者才能通信

一种是 “ 无连接 ”,相当于“ 发微信 ”

数据库这里的通信方式采取的是有连接的方式

好处是,就是能够在通信之前,先"投石问路", 先看看通信的链路是否畅通

坏处是,就是连接需要进行管理.尤其是不用的连接要记得及时释放 (以前用座机的时候,经常有一种bug,电话没扣严实)

使用dataSource.getConnection来建立连接

image-20220717091858251

然后我们发现

image-20220717092018795

这是数据库编程中常见的异常,受查异常,(受查异常一定要手动处理,非受查异常不一定要手动处理)

  1. throws
  2. try catch

image-20220717092329245

啥时候会抛出异常?

和数据库连接失败的时候就会抛异常

啥时候会连接失败,原因有很多

DataSource这里填写的信息,任何有一点点纰漏,都会导致连接失败。一般耐心阅读失败的详细信息,都是可以很容易找到问题的

看到了这个对象就说明现在已经连接成功了

image-20220717092609362

如果密码或用户名输错了就会这样

image-20220717092720941

第三步,构造 SQL 语句,(JDBC 操作数据库,本质仍然是通过 SQL 来描述数据库操作)

        //例如,插入数据的操作
        //直接用String 格式的类还不行,还需要搭配一个特殊的类
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);

image-20220717094008307

第四步,执行SQL

        //4.执行SQL
        //insert,update,delete都是通过 executeUpdate 来执行的
        // select 则是通过 executeQuery 来执行的
        //executeUpdate的返回值是一个整数,表示这个操作影响到几行
        int n = statement.executeUpdate();

image-20220717094440895

第五步,断开连接,释放资源 (后创建的先释放)

        //5.断开连接,释放资源 (后创建的先释放)
        statement.close();
        connection.close();

image-20220717094730116

完整的代码

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

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

public class jdbcHello {
    public static void main(String[] args) throws SQLException {
        //1. 使用 DataSource 描述 MySQL 服务器的位置
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //2. 和 数据库 建立连接 使用dataSource.getConnection来建立连接
        Connection connection = dataSource.getConnection();
        //System.out.println(connection);

        //3. 构造 SQL 语句,JDBC 操作数据库,本质仍然是通过 SQL 来描述数据库操作
        //例如,插入数据的操作
        //直接用String 格式的类还不行,还需要搭配一个特殊的类
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);

        //4.执行SQL
        //insert,update,delete都是通过 executeUpdate 来执行的
        // select 则是通过 executeQuery 来执行的
        //executeUpdate的返回值是一个整数,表示这个操作影响到几行
        int n = statement.executeUpdate();
        System.out.println("n = "+n);

        //5.断开连接,释放资源 (后创建的先释放)
        statement.close();
        connection.close();
    }
}

看一看运行的效果把~

image-20220717094859215

然后我们打开MySQL命令行客户端查看,发现操作成功

image-20220717095044549

如果再次执行程序,是会报错的!

image-20220717094936652

小结: JDBC中的关键概念

  1. DataSource描述了数据源. (数据在哪,服务器在哪…
  2. Connection表示一个连接. 需要先建立连接才能进行通信。一个数据库服务器可以同时处理多个连接.
  3. PreparedStatement描述了一个SQL语句,通过这个对象来执行SQL

看,发现操作成功

image-20220717095044549

如果再次执行程序,是会报错的!

[外链图片转存中…(img-N3fFa8vp-1658023416775)]

小结: JDBC中的关键概念

  1. DataSource描述了数据源. (数据在哪,服务器在哪…
  2. Connection表示一个连接. 需要先建立连接才能进行通信。一个数据库服务器可以同时处理多个连接.
  3. PreparedStatement描述了一个SQL语句,通过这个对象来执行SQL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现Java的JDBC编程(基本概念,驱动包安装) 的相关文章

  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 当分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?

    我有看起来像这样的 GraphTraversals attrGroup GraphTraversal
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • Spring 基于ApplicationEvent、ApplicationEventPublisher、ApplicationListener的事件监听、发布记录

    1 概述 事件发布和订阅具体流程 1 具体要发布的事件 事件中携带发送的数据 2 发送事件 3 监听器 监听发布的事件 获取事件的携带数据 执行业务逻辑 发布 事件作为参数 事件 监听 事件作为参数 例如 使用切面记录系统日志 发送相同类型
  • oracle 9i在线重定义,Oracle 9i中表的在线重定义(转)

    今天遇到要把数据库中的某张表改成分区表 而且该表在别的地方还有其他的注册信息 如果自己手工建一个分区表的替代该表的话 那就得要手工地去执行该表在其他地方的注册 所以不想删除该表再手工创建同名的分区表 想到了Oracle 9i中可以使用在线重
  • gitee上传代码方法(命令)

    第一次上传 创建一个gitee仓库 在 我的电脑 里找到你要上传的文件的位置 在地址栏输入cmd 回车 输入git init 输入git add 输入git commit m 备注信息可更改 输入 git remote add origin
  • C语言中的清屏函数(自己编写)

    在csdn论坛里看到这样一个问题 如何在c语言命令提示下清除屏幕 感兴趣 随查之 有解 include
  • 蓝帽杯半决赛2022

    手机取证 1 iPhone手机的iBoot固件版本号 答案参考格式 iBoot 1 1 1 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证 2 该手机制作完备份UTC 8的时间 非提取时间 答案参考格式 200
  • 修炼离线:(五)hbase映射表插入hive

    一 创建hive表 sql drop table if exists ods odsyyy create table if not exists ods odsfff row id string comment 行记录唯一ID 对应ROW
  • Makefile入门二、理解$@、$^和$<

    文章目录 一 理解 lt 的含义 二 举例 三 简提Makefile中打印日志信息 前面简单记录了一下Makefile中helloworld的用法 这次来理解一些 lt 的含义 一 理解 lt 的含义 Makefile中 格式为这样的 ta
  • Spring Roo 实站( 一 )部署安装 & 第一个示例程序

    一 安装 注 可以参与官网spring roo static springsource org spring roo reference html intro html intro exploring sampleROO OPTS http
  • 【Linux 驱动篇(二)】LED 驱动开发

    文章目录 一 Linux 下 LED 灯驱动原理 1 地址映射 1 1 ioremap 函数 1 2 iounmap 函数 2 I O 内存访问函数 2 1 读操作函数 2 2 写操作函数 二 实验程序编写 1 LED 灯驱动程序编写 2
  • 电脑不能开热点的一种可以尝试的解决方法

    1 说明 方法不一定万能 个人情况 win10 以前可以开热点 不知何时起不能再开 会显示 我们无法设置移动热点 2 解决办法 1 管理员方式打开cmd 2 运行命令 netsh int ip reset netsh winsock res
  • 【金融系列】【statsmodels】如何用Python做实证研究?介绍一个功能和STATA很像的Python包,最小二乘,虚拟变量

    博主本科接触的研究主要是公司金融方向的研究 在公司金融的实证研究中 我们的终极目标是建立变量间的因果关系 我们需要识别因果关系 来检验理论 评价政策效果 或作出预测 目前该领域的研究大部分是使用了STATA和R这两种工具来开展研究的 其实作
  • 亲测可用:opencv图片序列转视频

    亲测可用 glob函数可以遍历文件夹下文件 完毕后可在项目目录下生成output avi视频 可以稍作改进 转换的时候显示当前转换图像 include
  • 网络安全专业毕业设计最新最全选题精华汇总-持续更新中

    前言 大家好 这里是海浪学长毕设专题 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的升学就业做准备 一边要为毕业设计耗费大量精力 学长给大家整理了网络安全专业最新精选选题 如遇选题困难或选题有任何疑问
  • 将语雀文档迁移到飞书

    前言 我爬虫课程的文字版内容沉淀在语雀的知识库中 一开始感觉很不错 随着课程一直在卖 很快就超过了200人的限制 我已经是个人版中最高级的会员了 但语雀知识库的协作人数依旧限制在200人 即花钱无法解决问题 先说一下我的需求 我需要一个可以
  • 深度学习之实现图像数据增强

    深度学习之实现图像数据增强 前言 数据增强的意思就是让数据量增多 对于深度学习来说 大的数据量可以训练出更好的深度学习模型 在图像增强方面 我们常用的手段如下 旋转 翻转 缩放 平移 尺度变换 对比度变换 噪声扰动 颜色变换 1 使用ten
  • What the f*ck Python!(中文翻译版)

    What the f ck Python From https github com leisurelicht wtfpython cn 一些有趣且鲜为人知的 Python 特性 Python 是一个设计优美的解释型高级语言 它提供了很多能
  • SPFA 算法模板

    SPFA 代替 Dijkstra 计算最短路 题目 题目链接 题解 SPFA 一般时间复杂度为 O m O m O m 最坏情况下为 O
  • CNN人脸识别项目(dlib+opencv)

    CNN人脸识别 获取数据集 读取数据集 数据预处理 建立模型进行预训练 对图片进行人脸进行检测并进行可视化 总结 思路 一个CNN人脸识别项目首先必不可少的是数据集 获取的方式有网站数据库 PubFig Public Figures Fac
  • ORACLE查询删除重复记录三种方法

    比如现在有一人员表 表名 peosons 若想将姓名 身份证号 住址这三个字段完全相同的记录查询出来 复制代码代码如下 select p1 from persons p1 persons p2 where p1 id lt gt p2 id
  • 如何实现Java的JDBC编程(基本概念,驱动包安装)

    Java的JDBC编程 这里写目录标题 Java的JDBC编程 1 概念 2 安装驱动包 3 实现JDBC编程 1 概念 何为 JDBC编程 就是通过Java代码来操作数据库 咱们学数据库 无论是命令行 还是图形化界面 都不是开发中的主流使