[MySQL数据库] Java的JDBC编程(MySQL数据库基础操作完结)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀Java EE(94平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
目录
- 1. Java的数据库编程-----JDBC
- 2. JDBC工作原理
- 2.1 JDBC的访问数据库层次结构:
- 2.2 JDBC的优势:
- 3. JDBC的使用
- 3.1 导入JDBC的.jar文件
- 3.2 JDBC编程基本步骤
1. Java的数据库编程-----JDBC
在数据库的编程中,由于各个数据库的编程方式各不相同,所以在市场上流行着很多数据库,这就成为了程序员们非常头疼的一个点,于是这时候就需要一个人来统一天下,于是Java老大哥便站了出来.每一种数据库都需要给Java语言提供一个API,把原生的API进行封装,按照Java的规定统一过来.JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范.这个API由java.sql.*,javax.sql.*
包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.
[注释] 什么是API: API(Application Progromming interface 应用程序编程接口),就可以理解为一组"类",或者是"接口",有的库API非常多,就形成了SDK(软件开发工具包),例如:jdk.
2. JDBC工作原理
JDBC为多种关系型数据库提供了统一的访问方式,作为特定数据库厂商访问API的一种高级抽象,他主要包含一些通用的接口类.
2.1 JDBC的访问数据库层次结构:
这里的数据库JDBC驱动程序是数据库提供的"接口转换程序",通过驱动程序把数据库原生的应用程序编程接口和Java的应用程序编程接口转接过来,就可以理解为我们常用的转接头.
2.2 JDBC的优势:
- 开发数据库应用不受特定数据库厂商API的限制.
- 应用程序的可移植性大大增强.
- Java语言访问数据库操作完全面向抽象接口编程.
3. JDBC的使用
首先我们需要下载JavaJDBC编程的第三方库,把Java和MySQL建立联系.这里我们从"中央仓库"中即可下载.
JDBC下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.49
下载好了之后,我们就会得到一个后缀名为.jar的文件.此时我们就可以建立连接了.
3.1 导入JDBC的.jar文件
- 首先我们新建一个项目,在根目录下新建一个目录.命名为lib.
- 之后我们把.jar文件导入该目录中.
- 之后右键.jar文件,选择"添加为库".
3.2 JDBC编程基本步骤
在导入成功之后,我们就可以开始编程了.
- 首先创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("qwe123524");
第一行就是让数据库厂商与JDBC进行对接,就是让数据库厂商实现JDBC中提供的提供的interface,进一步实现其中约定好的抽象方法.
下一行就是固定的写法,直接照抄.
之后就是输入用户名,用户名默认为"root".
下一行就是该用户登录数据库的密码.
[注意] 在与数据库建立连接的时候,使用的是向上转型的方式,在使用数据源中的方法的时候,再向下转回来.之所以要这样做,是为了根便于代码与数据库之间==“解耦合”(低耦合)==,万一哪天要换数据库的时候,改动成本就会降低.
一种写代码的追求:高内聚,低耦合
高内聚就是实现某个功能的时候,如果这个功能相关的代码.,是集中放到一起的,就认为是"高内聚".如果是散落在项目的各个文件,就认为是"低内聚".
低耦合就是在写代码的时候,会有很多模块,如果一个模块的代码修改之后,对其他的模块影响很小,就叫低耦合.
- 客户端和数据库服务器进行连接
Connection connection = dataSource.getConnection();
在进行client和server通信的时候,常见的方式有两种模式:有连接和无连接.
1. 有连接:(JDBC这里就是有连接)比如我们在打电话的时候,我们需要先拨号---->连接---->接听三部.
2. 无连接:比如我们我们发微信,不需要用户接听,就可以直接发过去.
- 构造一个操作数据库的sql语言
System.out.println("姓名:");Scanner scanner = new Scanner(System.in);System.out.println("职位类型:");Scanner scanner1 = new Scanner(System.in);System.out.println("薪水:");Scanner scanner2 = new Scanner(System.in);String name = scanner.next();String role = scanner1.next();int salary = scanner2.nextInt();String sql = "insert into emp values(null,"+name+","+role+","+salary+")";
这里我们构建一个在emp表中插入员工的字符串.
PreparedStatement preparedStatement = connection.prepareStatement(sql);
这里就相当于告诉编译器,该字符串是一个可执行的sql语句.
这里也可以使用Statement类来进行接收,但是我们最好用prepareStatement,是因为我们发射红一个字符串带server上的时候,先要判定是否合法,Statement接收的写法是在server上进行验证.而PrepareStatement的写法是在client上进行验证,这样就可以有效避免不合法的语句对数据库的影响.
- 执行sql
在构建好sql语句之后,我们就可以对prepareStatement语句进行执行了.
int n = preparedStatement.executeUpdate();
System.out.println(n);
由于是插入操作,所以涉及到对数据库的更新.所以execute的后缀就是update.如果是查询操作的话,不涉及到数据库的更新,所以后缀就是Query.
executeUpdate方法会有返回值,这里的返回值就表示的是表中的几行数据有了改变.
执行这个方法之后,就会在内部给数据库的server发送一个请求,请求内部就包含了prepareStatement解析之后的sql语句,数据库在执行sql语句之后就会返回响应,获取响应之后就会通过返回值体现出来.
这是我们看到表emp中有以下数据:
我们执行该sql语句,插入"王十三,数据库运维,12000"
我们看到数据库发生了改变.
- 收尾工作-----关闭资源.
preparedStatement.close();
connection.close();
为什么要关闭资源?是因为编程中设计到的"有限资源",不仅仅有内存如果是内存资源,JVM可自动回收,但是其他的,JVM就无能为力,需要手动释放.
[注意] 创建顺序与释放顺序相反,就像我们平时穿衣服和脱衣服的顺序一样.
- 最终代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class Demo {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("qwe123524");Connection connection = dataSource.getConnection();System.out.println("姓名:");Scanner scanner = new Scanner(System.in);System.out.println("职位类型:");Scanner scanner1 = new Scanner(System.in);System.out.println("薪水:");Scanner scanner2 = new Scanner(System.in);String name = scanner.next();String role = scanner1.next();int salary = scanner2.nextInt();String sql = "insert into emp values(null,"+name+","+role+","+salary+")";PreparedStatement preparedStatement = connection.prepareStatement(sql);int n = preparedStatement.executeUpdate();System.out.println(n);preparedStatement.close();connection.close();}
}
相关文章:

[MySQL数据库] Java的JDBC编程(MySQL数据库基础操作完结)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...

绿色瓶装水“暗战”竞争越发激烈,华润饮料谋上市同时多地扩产能
《港湾商业观察》黄懿 4月23日,纯净水牌“怡宝”母公司华润饮料(控股)有限公司(下称“华润饮料”)向港交所主板提交上市申请,联席保荐人为中银国际、中信证券、美银美林、瑞银集团。 在华润饮料递表不久之…...
C语言之指针详解(4)
文章目录 一、回调函数二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort函数排序结构体数据 三、qsort函数的模拟实现 一、回调函数 首先我们先来了解一下什么是回调函数 回调函数通俗来讲就是一个通过函数指针调用的函数。 如果你把函数的指针(地址&am…...

0基础学习小红书博主IP特训营,37天 教你从小白到KOL(13节)
课程内容: 1 第一课:如何做好博主账号定位 .mp4 2 第一课作业,html 3 第二课:如何打造小红书爆款笔记(一)_.mp4 4 第二课:如何打造小红书爆款笔记(二).mp4 5 第二课作业,html 6 第三课:如何高效搭建选题库 .mp4 7 第三课作业,html 8 第四课:破解流量玄学&am…...

【openlayers系统学习】3.1-3.2彩色GeoTIFF图像渲染
一、彩色GeoTIFF图像渲染 Sentinel-2 卫星任务收集并传播覆盖地球陆地表面的图像,重访频率为 2 至 5 天。传感器收集多波段图像,其中每个波段都是电磁频谱的一部分。 2A 级 (L2A) 产品提供以下频段的表面反射率测量: BandDescriptionCentra…...

前端自动将 HTTP 请求升级为 HTTPS 请求
前端将HTTP请求升级为HTTPS请求有两种方式: 一、index.html 中插入meta 直接在首页 index.html 的 head 中加入一条 meta 即可,如下所示: <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests&…...
辅助驾驶ADAS功能算法介绍
一、ADAS功能分类 按照行驶域划分,将ADAS功能分为行车功能、泊车功能和主动安全功能。 行车功能 ACC(Adaptive Cruise Control)自适应巡航控制TJA(Traffic Jam Assist)交通拥堵辅助LCC(Lane Centering Control)车道居中控制ICC(Integration Cruise Control)智能巡航系…...

Docker 安装kingbase V8r6
下载 官网下载,注意:这里下载 Docker 版本v8r6 安装 # 导入镜像 docker load -i kingbase.tar# 重命名 docker tag [image-name]:[tag] [new-image-name]:[new-tag]# 删除 docker rmi [image-name]:[tag]# 创建容器 docker run -tid \ --privileged \…...
Python 应用打包成 APK【全流程】
将 Python 应用打包成 APK。 文章目录 步骤 1: 安装 Buildozer 和其依赖Linux (Ubuntu) 环境下安装: 步骤 2: 创建你的 Python 应用步骤 3: 配置 Buildozer步骤 4: 打包成 APK总结 步骤 1: 安装 Buildozer 和其依赖 首先确保你的系统中已安装 Python 和 pip。接下来ÿ…...

jmeter之MD5加密接口请求教程
前言: 有时候在项目中,需要使用MD5加密的方法才可以登录,或者在某一个接口中遇到 登录获取token后才可以进行关联,下面介绍下遇到的常见使用 一、第一种方法:使用jmeter自带的函数助手digest 选择工具,选…...

R18 NTN中的RACH-less HO
在看R18 38.300时,发现NTN场景 增加了如下黄色字体的内容,R18 NTN支持了RACH-less HO,索性就简单看了看。 NTN RACH less HO相关的描述主要在38.331,38.213和38.321中。38.300中的描述显示:网络侧会通过RRCReconfiguration消息将RACH-less HO相关的配置下发给UE, 其中会包…...

QT使用gsoap获取手机归属地
1-环境变量 用的win32 E:\hes_scc\tools\gsoap_2.8.134\gsoap-2.8\gsoap\bin\win32 2-生成代码接口 自己建一个目录,在此打开cmd窗口,生成的文件都会在这个文件夹中。 这里用的手机归宿地。 wsdl2h -o GetPhoneInfo.h -s -n Phone -t ....\typemap.…...

抖音本地生活服务商入驻指南分享!
当前,各大平台的团购外卖业务持续火爆,并逐渐成为众多创业赛道中的大热门。其中,本地生活服务更是在短时间内杀出重围,成为创业者们的首选。 根据抖音生活服务近日发布的《2023年度数据报告》,2023年,抖音生…...
【量算分析工具-水平距离】GeoServer改造Springboot番外系列四
【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…...

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 及 make_** 函数的源码注释汇总,和几个结论
智能指针的源码都在 《memory》 头文件中。因为头文件太长,再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析,注释。 (1 探讨一)当独占指针指向数组时,其默认的删除器是…...

【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型 前言 实际上关于开源or闭源,一直以来都是颇有争议的话题,人们争执于数据的隐私性和共享性,到底哪一方能获得的收益更大。而对于开源与闭源哪个更好实际上也就是说是…...

强化学习——学习笔记
一、什么是强化学习? 强化学习 (Reinforcement Learning, RL) 是一种通过与环境交互来学习决策策略的机器学习方法。它的核心思想是让智能体 (Agent) 在执行动作 (Action)、观察环境 (Environment) 反馈的状态 (State) 和奖励 (Reward) 的过程中,学习到…...
NAT简介
一、NAT 概念定义 NAT(Network Address Translation,网络地址转换)是一种将私有 IP 地址转换为公有 IP 地址的技术。 允许一个组织内部使用私有 IP 地址的网络通过少量的公有 IP 地址连接到互联网。实现了私有网络与外部网络的通信…...

联想凌拓 NetApp AFF C250 全闪存存储助力丰田合成打造数据新“引擎”
联想凌拓 NetApp AFF C250全闪存存储助力丰田合成打造数据新“引擎” 丰田合成(张家港)科技有限公司(以下简称“丰田合成”)于2003年12月成立,坐落在中国江苏省张家港市保税区中华路113号,是日本丰田合成株…...

红队技巧:仿冒Windows登录
Metasploit框架:phish_windows_credentials Metasploit带有内置的后期漏洞利用功能,可帮助我们完成任务。由于它是后渗透的模块,因此只需要输入会话即可: use post/windows/gather/phish_windows_credentials set session 1 …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...