当前位置: 首页 > news >正文

MySQL:JDBC

什么是JDBC?

JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担心其数据库操作语言的差异 。 有了JDBC,就不必为访问Mysql数据库专门写一个程序,为访问Oracle又专门写一个程序等等。

为什么要有JDBC?

看看大佬的回答:

第一 :JDBC是Java中操作数据库数据的规范,注意是规范和标准,除此之外别无它号,即使Hibernite,Batis 也是要建立在JDBC基础上的。JDBC定义了如何链接数据库(Connection),如何操作数据(ResultSet,Stement)和事务管理(Transcation ,SavePoint...),JDBC具体的实现是由数据库厂商或第三方提供。
第二: 理论上说,不用JDBC也可以直接操作数据库,但是很多情况下这些东西是无法实现的,比如在链接一个数据库时厂商会对通讯协议中的部分内容保密仅提供数据库驱动,很难查找到相关的资料,即使有也会涉及到版权这些问题。除此之外上层的数据操作接口也要重新定义和编写。

JDBC工作原理

既然JDBC主要是用于java连接数据库的,能连接什么数据库没有指定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种。但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那帮人想出了一个办法,我定义一套规则,大家都按照这个规则来,实现自己公司访问数据库的实现。这套规则就是JDBC,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动。

JDBC是不动的,但是驱动包有很多种。

如何链接JDBC

首先需要下载驱动包

Java驱动包一般在该网站中下载:maven中央仓库

Maven Repository: (mvnrepository.com) 

在搜索框中输入你想下载的驱动包:

如图:

点进去以后:

 注意要下载与你MySQL版本相同(大版本)的驱动包,否则就会报错;

中间的红色是说该版本有缺陷,黑客可以通过该缺陷攻击你的数据库,但是我们初学者没必要慌,咱数据库随便他们偷!

下载完以后,打开编译器,创建一个 lib 包:

然后将下载的驱动包直接用鼠标拖进来就可以了。

然后右键点击add as library : 

这样idea就可以识别目录中的 jar 包了,从而调用里面的类来编写代码。 

包中类/接口,如下图:

准备工作完成,接下来就可以正式开始写代码了;

JDBC完成开发需要如下几个步骤来操作:

  1. 遍历并初始化一个数据源
  2. 和数据库服务器建立链接
  3. 构造MySQL语句
  4. 执行MySQL语句
  5. 释放必要资源

1. 遍历并初始化一个数据源

我们需要创建一个数据源:

该数据源来自我们下载的驱动包:

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

为什么我们要这么做,我们不能创建一个MysqlDataSource()拿 MysqlDataSource 类型来接收吗?

当然可以,这样后面也就不用再向下转型了,这样还更方便了。

但是上面代码为啥要这么写呢?

主要是大家都这么写,体现接口的统一性。

我们来看看每一句数据源的含义: 

setUrl("jdbc:mysql://127.0.0.1:3306/java_107_3?characterEncoding=utf8&useSSL=false")

setUser("root")

setPassword("")

2. 和数据库建立链接


Connection connection = dataSource.getConnection();//注意包要导对:java.sql.Connection

getConnection 方法好多包中有存在,但是我们需要 sql 包下的方法。

注意:

这里包一个异常需要抛出。

3. 构造MySQL语句

即使使用代码来操作数据库仍然需要使用mysql语句来构造。

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

 切记,构造时要确保该表存在。

PreparedStatement statement = connection.prepareStatement(sql);

该语句是对mysql语句进行预编译,

如果请求是sql 字符串,服务器是可以处理的,服务器就需要对其解析并执行,但是如果大量数据同时发起请求,那么服务器压力就会非常大。

那么进行一个预编译就会减小服务器的压力。

preparestatement

1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程

2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。

当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。

这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。

来自:preparestatement的用法-百度知了好学 

4. 执行MySQL语句

 int ret = statement.executeUpdate();System.out.println("ret = " + ret);

statement.executeUpdate();

预编译过的sql语句发送给服务端,服务端作出相应,返回值为 int类型;其含义为:sql语句所影响的行数。

5. 释放必要资源

//5. 释放必要资源
statement.close();
connection.close();

谁后创建,谁先释放。

释放完资源这样简单的JDBC链接就完成了。

修改sql构造语句

但是显然我们整个过程还是有缺陷的。

看下图: 

这里直接将sql语句写死了,无法灵活改变,改写法可读性差,且易被sql注入

所以我们还需要在这里进一步改变。

我们在这里改为从控制台读取输入信息,再通过拼装功能来完成对构造。

 虽然这样解决了以上问题,但是明显不好写,并且容易写错,那么我们可以通过PreparedStatement拼装功能来实现。

代码如下:

        //3. 从控制台读取用户输入内容System.out.println("请输入学生学号");int id = scanner.nextInt();System.out.println("请输入学生名字");String name = scanner.next();//4. 构造MySQL语句String sql = "insert into student values(?,?)";//'?' 表示一个占位符PreparedStatement statement = connection.prepareStatement(sql);//将占位符替换成指定的值statement.setInt(1,id);//将第一个 '?' 替换为idstatement.setString(2,name);//将第二个 '?' 替换为name//  打印需要加到拼凑之后System.out.println(statement);//5. 执行MySQL语句int ret = statement.executeUpdate();System.out.println("ret = " + ret);

 那么本章的JDBC就到这里了,MySQL也就结束了,下一章内容就要开始JavaEE 的内容,难度又是大幅度提升。

相关文章:

MySQL:JDBC

什么是JDBC? JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担…...

C++【list容器模拟实现函数解析】

list容器&&模拟实现函数解析 文章目录list容器&&模拟实现函数解析一、list容器使用介绍二、list容器模拟实现及函数解析2.1 list结构体创建2.2 迭代器封装2.21 构造函数:2.22 前置和后置及- -2.23 解引用2.24 判断相等2.25 箭头重载2.26 第二个和第…...

(Java)试题 算法提高 约数个数

一、题目 (1)资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s (2)输入 输入一个正整数N (3)输出 N有几个约数 &a…...

魔法反射--java反射初入门(基础篇)

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 java反射初入门 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️如果文章有…...

概率统计_协方差的传播 Covariance Propagation

1. 方差的传播 误差的传播是指分析在形如的关系中,参量误差(x)对变量误差(y)的影响有多大。误差的传播与函数的微分紧密相关,本质是在利用当Δ x 不大时,。 方差计算公式: X为变量,为总体均值,N为总体例数。求变量X与均值的差的平方再求平均值,即得到方差。方差…...

大学生考研的意义?

当我拿起笔头,准备写这个话题时,心里是非常难受的,因为看到太多的学生在最好的年华,在自由的大学本应该开拓知识,提升认知,动手实践,不断尝试和试错,不断历练自己跳出学生思维圈&…...

【C++笔试强训】第三十一天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 选择题 &#x…...

toString()、equals()是什么,为啥需要重写,多种方法来重写

https://m.runoob.com/java/java-object-class.html toString() 1.为什么会有toString 子类继承父类就可以使用父类所有非私有的属性的方法。 在Java中所有类都直接或者间接继承Object类,可以说只要是Object类里面定义的非私有的属性和方法,任何类都可…...

家装材料清单中会有哪些装饰材料?

在家居装修中,业主可以根据装修公司出具的材料清单去一一采购,这样不至于有遗漏,就算采用全包的方式,通过材料清单也可以大致了解当时房子装修所用的材料,补充自己的装修知识。下面跟随小编一起了解下房子装修材料中所…...

【C++初阶】6. CC++内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* …...

【数据结构】万字超详解顺序表(比细狗还细)

我这个人走得很慢,但是我从不后退。 ——亚伯拉罕林肯 目录 一.什么是线性表? 二.什么是顺序表? 三.接口函数的实现 1.创建工程 2.构造顺序表 3.初始化顺序表 3.初始化顺序表 4.顺序表的尾插 5.顺序…...

yolov5 剪枝、蒸馏、压缩、量化

文章大纲 剪枝推理优化YOLOv5 剪枝可能出现的问题参考文献与学习路径考察神经网络时期重要的激活函数sigmoid和tanh,它们有一个特点,即输入值较大或者较小的时候,其导数变得很小,而在训练阶段(详见1.2.3节),需要求取多个导数值,并将每层得到的导数值相乘,这样一旦层数…...

如何用python代码,更改照片尺寸,以及更换照片底色

前言 python浅浅替代ps?如何用代码来p证件照并且更换底色? 唉,有个小姐姐给我扔了张照片,叫我帮忙给她搞成证件照的尺寸还得换底色,她说自己忙的很 可惜电脑上没有ps只有pycharm,没得办法只能来试试看代…...

【pygame游戏】Python实现蔡徐坤大战篮球游戏【附源码】

前言 话说在前面,我不是小黑子~😏 本文章纯属技术交流~娱乐 前几天我获得了一个坤坤打篮球的游戏,也给大家分享一下吧~ 好吧,其实并不是这样的游戏,往下慢慢看吧。 准备工作 开发环境 Python版本:3.7.8 …...

通过指针引用字符串详解,以及字符指针变量和字符数组的比较

在平常的案例中已大量地使用了字符串,如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的,在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便的方法:通过指针引用字符串。 目录 一、…...

Vue基本整合(一)

NPM安装npm是node的包管理工具https://nodejs.org/en/脚手架安装npm i -g vue/clihttps://registry.npmjs.org/vue浏览器插件https://devtools.vuejs.org/guide/installation.html#chromehttps://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhble…...

C++编程之 万能引用

万能引用是一种可以同时接受左值或右值的引用,它的形式是T&&,其中T是一个模板参数。万能引用不是C的一个新特性,而是利用了模板类型推导和引用折叠的规则来实现的功能。 模板类型推导 模板类型推导是指在调用一个模板函数时&#x…...

【JavaScript速成之路】JavaScript内置对象--数组对象

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言数组对象1,数组类型检测2,数组元素增删3,…...

【华为机试真题详解 Python实现】最差产品奖【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…...

[算法] 二分查找

package com.guigu.search;import java.util.ArrayList; import java.util.Arrays;/*** author: guorui fu* versiion: 1.0* 二分查找 直接适用于已经排序完成的数组*/ public class BinarySearch {public static void main(String[] args) {int arr[] {1,8,8,89,101,1234};Ar…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...