“手撕”全网最细的JDBC教程(安装导入使用)
目录
一、什么是JDBC
二、JDBC的安装
三、JDBC如何导入
四、怎么使用JDBC编写代码
一、什么是JDBC
JDBC由Java提供给数据库的一组通用的API。
在平常的业务中,是比较少使用像cmd命令行来操作数据库的,更多的是操作代码(Python,Java,C++,Go等等),但是还是会使用到sql语句。通过代码操作数据库的时候,数据库要提供一份API,供其他程序来调用。
什么是API?
答: API全名是Application Programming Interface(应用程序编程接口)。我们在写代码的时候并不是从0开始写的,可以调用别人写好的代码,也叫做“库”,这些代码里就有一些“函数‘”接口“”方法“”类“等等(比如Java标准库中提供了String,LIst等等),这就叫做API。
为什么需要用Java提供的呢,不能用自己写的/公司的呢?
答:数据库中像MySQL、Oracle、SQL Server,他们都是用自己的API,每个都有一套,那么就苦了程序员了,假设你跳槽去一家公司,用的是不同的API,那就需要重新学了。
那么有没有一套标准的API呢,谁都可以用的那种?
答:有,那就是JDBC,Java的提供API,它可以把数据库自己的API转化成Java兼容的API。因为Java是这个咱们编程行业的老大哥,说话有分量,所以数据库需要JDBC来解决上述的问题。
二、JDBC的安装
既然JDBC这么好,怎么安装啊???我们需要下载MySQL Connector,这玩意儿,既不是Java自带的,也不是MySQL自带的。是我们需要自己下载的第三方库。
我们可以通过以下三种途径安装:
1)官方网站,Oracle官网2)GitHub
3)maven中央仓库
前两个方案可以用,但是比较麻烦,所以推荐第三种,接下来也是演示第三种。
a)maven中央仓库网址:https://mvnrepository.com
由于是国外的网站,所以进入的时候可能会需要等待个几秒钟
打开这个网址
如图:

b)在上面的搜索栏输入MySQL关键字,回车

c)如果你的数据库不是最新款的,那么点击第二个

这里需要注意的是,如果你的MySQL是8的版本,那么要选择8.0.7及以上的,像我的是5.7版本的,只需要选择5以上的版本即可。
如何查看?如图下:
d)下载jar压缩包

e)解压(这个jar包里面其实放了一堆Java的.class文件)

之后你就能看到很多.class文件了

三、JDBC如何导入
1)下载jar包
2)导入jar包
a)现在项目中创建一个目录(名字不要带有中文/特殊字符)

输入一个lib(这个是名字,你想起别的也行) ,这样就多出了一个lib目录了

为什么起lib呢?
答: lib全名是library(图书馆),在咱们计算机中还有个专业名词,叫”库“(就是别人写好的代码,我们可以直接调用)
b)把jar包导入到lib目录里面 (复制jar包,粘贴到lib目录里)

在lib目录粘贴,点击确定

c)右键lib目录,添加库 (告诉idea这是个库,让idea能够读取)

啥都不用做,点击ok就行了,这时候这个东西就导好了

四、怎么使用JDBC编写代码
1)创建数据源对象 ,就是描述了数据从哪里来or数据库服务器的位置
DataSource dataSource=new MysqlDataSource();//向上转型//为了使用这些方法需要向下转型
((MysqlDataSource)dataSource).setURL();
((MysqlDataSource)dataSource).setUser();
((MysqlDataSource)dataSource).setPassword();
或者还有另一种写法:
MysqlDataSource mysqlDataSource=new MysqlDataSource();
mysqlDataSource.setURL();
mysqlDataSource.setUser();
mysqlDataSource.setPassword();
注意:
DataSource是接口,不能直接实例化对象,只能通过它的子类实例。
那么两种方法哪种好呢?
答:没有谁更好,支持第一种写法的人的原因:这样写耦合程度更低(耦合程度指的是板块与板块之间的影响),因为后续写代码的时候不用mysqldatasource,而是用datasource,如果后面你想更换mysql变为Oracle的话,直接修改几处mysqldatasource就够了。
支持第二种写法:实际开发中更换数据库,本身就是低频操作,为了降低耦合度而写了一大堆转型,那是得不偿失的;并且更换数据库需要综合考察,并非是更换三四个代码这么简单。
什么是URL
答:称为“网络资源唯一定位符”,用来描述网络上一个资源的位置,讲人话那就是“链接”。但是它和我们平常用的网址却有些不同。
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1024");
像URL我们不用去背,只需要了解里面的组成是什么即可。
1)jdbc:mysql,描述的用途,指的是这个jdbc是给mysql来使用的。2)127.0.0.1,是IP地址。mysql是客户端服务器结构的程序,客户端和服务器之间是通过网络来通信的,此时就通过IP地址这样的概念,来描述mysql服务器是在那个主机上。127.0.0.1这个ip是一个特殊的地址,表示“你主机”,因为咱们jdbc的代码和mysql服务器都是在同一个机器上,此时ip地址就都固定写作127.0.0.1即可,如果在不同的主机上,就再写其他ip地址。
3)3306,是端口号,用来区分一个主机上的应用程序的,比如我这个机器上,就有好多引用程序在使用网络,比如网易云音乐,qq,微信,mysql服务器,后续发来一个网络的数据,是要交给那个程序的处理呢?这就需要端口好来区别了。mysql在安装的时候默认端口号是3306
4)javasql,是数据库名,就是咱们创建数据库的时候的名字
5)?后面的东西,都是对这次数据库的连接,起解释作用,比如characterEncoding指的是使用字符集utf8,而urlSSL=false指的是关闭 加密。
举个例子:
我在学校开了一家生意,现在在发传单,那么传单上就会写着:
jdbc:mysql://佛山市xxx学校:第5档口/金汤酸菜鱼?加辣吗=加辣&加香菜吗=加香菜
其中,IP地址是佛山xxx学校,端口号是第5档口,数据库是金汤酸菜鱼,解释说明是加辣加香菜。
root是mysql自带的用户,管理员用户,是权限最高的,password则写你数据库的密码。
2)和数据库服务器建立网络连接
Connection connection=dataSource.getConnection();
要选第一个

这时候会画红色波浪线,我们只需要alt+回车,在main方法中抛异常throws SQLException
检查连接是否成功,打印connection
正确的连接:
不正确的连接:
a)用户名,密码出错
b)数据库名写错
c)IP或端口号写错,或服务器没运行
3)编写sql语句
String sql="insert into student values(1,'张三')";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
为什么需要PreparedStatement这类:
preparedStatement(预编译的语句),基于这类来构造sql语句正常来说,我们在cmd命令行输入sql语句,是把sql语句发送到mysql服务器上面,mysql负责解析(检查语法错误,具体要完成上面工作等等,需要消耗资源)完成后执行,并且我们mysql服务器可能需要为多个客户端服务,解析工作积少成多,是消耗资源的。所以我们往往是先把解析工作做好,放到客户端上面自己完成,这样服务器就能减轻工作了。
PreparedStatement和PreparaStatement区别:
第一个是过去分词+名词,一般表类名
第二个是动词+名词(or动词),一般表方法名
那能不能让用户自己输入添加呢?当然可以:
Scanner scanner=new Scanner(System.in);
System.out.println("请输入用户id");
int id=scanner.nextInt();
System.out.println("请输入用户名");
String s=scanner.next();
PreparedStatement preparedStatement=connection.prepareStatement(sql);
但是以上可能不是很好:
a)阅读性差,写起来也不舒服
b)可能有人输入的时候,会注入攻击,比如他输入这个s的时候,输入‘)drop database xxxx删掉了库。
推荐用法:用占位符?(相当于c语言的%d)
String sql="insert into student values(?,?)";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setInt(1,id);
preparedStatement.setString(2,s);
4) 执行sql语句
int n = preparedStatement.executeUpdate();

一般使用红圈里面的两个方法,第一个是查询,第二个是更新(可能是delect,insert等等)
5)释放上述资源(逆序释放)
我是先创建的connection然后是preparedstatement,所以先释放preparedstatement,再是connection,相当于栈。比如你打开了两扇门,你要离开了,肯定是先关上小门,再是大门。
preparedStatement.close();
connection.close();
建立连接和创造这些语句,都是需要消耗一定的资源的(比如内存/硬盘/网络) 。如果不用了,就需要把这些关掉,去释放掉
这时候,执行,就插入了:

额外:若要查询操作:
String sql="select * from student";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
ResultSet set=preparedStatement.executeQuery();
//遍历
while(set.next()){System.out.println(set.getInt("id"));System.out.println(set.getString("name"));
}
set.close();
preparedStatement.close();
connection.close();
总的代码如下:
//1.创建数据源对象 DataSource dataSource=new MysqlDataSource();//向上转型//为了使用这些方法需要向下转型((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("1024");//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();System.out.println(connection);//3.构造sql语句//preparedStatement(预编译的语句),基于这类来构造sql语句String sql="insert into student values(4,'赵六')";PreparedStatement preparedStatement=connection.prepareStatement(sql);//4.发送到服务器上,让服务器执行//返回值表示这个sql影响到几行preparedStatement.executeUpdate();//5.释放资源preparedStatement.close();connection.close();
相关文章:
“手撕”全网最细的JDBC教程(安装导入使用)
目录 一、什么是JDBC 二、JDBC的安装 三、JDBC如何导入 四、怎么使用JDBC编写代码 一、什么是JDBC JDBC由Java提供给数据库的一组通用的API。 在平常的业务中,是比较少使用像cmd命令行来操作数据库的,更多的是操作代码(Pythonÿ…...
C++指针选择题带答案
1、有如下语句int a10,b20,*p1,*p2;p1&a;p2&b;如图1所示,若要实现图2所示的存储 结构,可选用的赋值语句是___________。 A)*p1*p2; B)p1p2; C)p1*p2; D)*p1p2; 2、变量的指针,其含义是该…...
力扣 二分查找
二分查找基础篇。 题目 class Solution {public int searchInsert(int[] nums, int target) {int l 0, r nums.length - 1;while(l < r) {int mid l((r-l)>>1);//(lr)/2if(nums[mid]<target)lmid1;else rmid-1;}return l;//处理边界,设定数组的左半…...
ADMAS-Simulink联合仿真输入设置
使用Solidworks、ADAMS、Simulink进行机电联合仿真_adams-simulink-CSDN博客RecurDynSimulink联合仿真案例演示_哔哩哔哩_bilibili# C#调用已经使用Python训练好的神经网络做图片检测_c#调用python训练好的神经网络模型-CSDN博客...
【NOI】C++程序设计入门三
文章目录 前言一、大杂烩1.导入2.常量3.标识符4.关键字5.整型补充5.1 short:短整型5.2 long:长整型5.3 long long:长长整型 二、例题讲解问题:1597. 买文具问题:1596. 火柴棒三角形问题问题:1417. 买文具问…...
Three.js投射光线实现三维物体交互
<template><div id"webgl"></div> </template><script setup> import * as THREE from three //导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入 dat.gui import { GUI } from thre…...
SSRF学习笔记
1.NAT学习 Nat(Network Address Translation,网络地址转换)是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址,以实现局域网内部设备访问互联网的功能。具体来说,Nat有以下几个主要…...
Python——Pandas(第三讲)
文章目录 修改替换变量值对应数值的替换指定数值范围的替换 虚拟变量变换数值变量分段数据分组基于拆分进行筛选 分组汇总使用 agg 函数进行汇总引用自定义函数 长宽格式转换转换为最简格式长宽型格式的自由互转 多个数据源的合并数据的横向合并concat 命令 处理缺失值认识缺失…...
性能测试中qps 一直上不去的原因
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 在性能测试中,QPS(每秒查询率)一直上不去可能由以下…...
学习笔记14:CNAME 记录值、TTL (Time to Live)、Redis 的 Pool 对象池、钩子函数、依赖注入
CNAME 记录值 CNAME 记录是一种DNS记录类型,它将一个域名映射到另一个域名。这通常用于将一个子域名指向另一个域名,或者将一个域名指向一个不同的顶级域。 用途:用于域名别名,负载均衡,或者在更换域名时保持服务的连…...
springboot集成mybatis时,dao层的mapper类需要添加@Repository注解吗?
在Spring Boot项目中,当你使用MyBatis作为ORM框架时,关于DAO层的Mapper类是否需要添加Repository注解,这主要取决于你的项目需求和配置。 Repository注解的作用Repository注解是Spring框架中用于声明持久层(DAO层)的组…...
一文总结代理:代理模式、代理服务器
概述 代理在计算机编程领域,是一个很通用的概念,包括:代理设计模式,代理服务器等。 代理类持有具体实现类的实例,将在代理类上的操作转化为实例上方法的调用。为某个对象提供一个代理,以控制对这个对象的…...
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
作者:运维有术星主 在 Kubernetes 生态系统中,持久化存储扮演着至关重要的角色,它是支撑业务应用稳定运行的基石。对于那些选择自建 Kubernetes 集群的运维架构师而言,选择合适的后端持久化存储解决方案是一项至关重要的选型决策。…...
全国区块链职业技能大赛样题第9套智能合约+数据库表设计
后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 nice.sql /* Navicat MySQ…...
常见OVS网桥及其链接接口详解
目录 引言OVS简介常见OVS网桥 QBR(qbr)PLY网桥br-intbr-tunbr-routerbrcps常见网桥链接接口 QVOQVIQVMPatch网桥和接口的工作原理应用场景 虚拟化环境数据中心网络云计算平台 1. 引言 开放虚拟交换机(Open vSwitch,简称OVS&…...
创建最最最纯净 Windows 11/10 系统镜像!| 全网独一份
前期准备工作 1.配置系统应答文件:【点击前往】 2.系统镜像编辑器: 【点击下载】 3.Windows 系统镜像官方下载: 【Windows 11】、【Windows 10】【官方密钥】 4.翻译工具 【GitHub】 5.详细的设置教程 5.1先打开配置系统应答文件&#…...
带你学会Git必会操作
文章目录 带你学会Git必会操作1Git的安装2.Git基本操作2.1本地仓库的创建2.2配置本地仓库 3.认识一些Git的基本概念3.1操作流程: 4.一些使用场景4.1添加文件场景一4.2查看git文件4.3修改文件4.4Git版本回退4.5git撤销修改 5.分支管理5.1查看分支5.2创建本地分支5.3切…...
clickhouse处理readonly报错
1,clickhouse执行 SYSTEM RESTORE REPLICA db_com.dwd_com_t_judge_result_local; SYSTEM RESTORE REPLICA db_com.dwd_com_t_judge_result_local Query id: 70669be0-eef8-41da-b761-4980ce48ece2 0 rows in set. Elapsed: 0.001 sec. Received exception fro…...
使用git命令行的方式,将本地项目上传到远程仓库
在国内的开发环境中,git的使用是必不可少的。Git 是一款分布式版本控制系统,用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式,将本地项目上传到远程仓库,虽然现在的IDE中基本都配置了g…...
jetbrains InterlliJ IDEA 2024.1 版本最新特性一览: Java 相关内容
简简单单 Online zuozuo:欢迎商业合作 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo :联系我们:VX :tja6288 / EMAIL: 347969164@qq.com 文章目录 jetbrains InterlliJ …...
华硕梅林固件下,让HP1020打印机在Linux网络环境中重获新生
1. 为什么HP1020打印机在Linux网络环境中会"罢工"? 每次看到那台尘封已久的HP LaserJet 1020打印机,我都觉得特别可惜。这台老伙计在Windows系统下表现一直很稳定,但当我尝试把它接入刷了梅林固件的华硕路由器时,却遇到…...
2024年TVBOX源接口终极整理:手把手教你如何筛选稳定高速线路
2024年TVBOX源接口高效筛选与优化指南 在流媒体内容消费日益普及的今天,TVBOX作为一款开源播放器解决方案,凭借其强大的扩展性和丰富的资源获取能力,赢得了众多技术爱好者的青睐。然而,面对网络上浩如烟海的源接口资源,…...
OpenGOAL编译器实战指南:如何构建你自己的Jak游戏
OpenGOAL编译器实战指南:如何构建你自己的Jak游戏 【免费下载链接】jak-project Reviving the language that brought us the Jak & Daxter Series 项目地址: https://gitcode.com/gh_mirrors/ja/jak-project OpenGOAL编译器是一个强大的工具,…...
会议纪要助手:OpenClaw+nanobot自动提炼讨论要点
会议纪要助手:OpenClawnanobot自动提炼讨论要点 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为技术负责人,我每周要参加至少5场会议,从需求评审到技术方案讨论,经常一开就是两小时。会后花半小时手动整…...
避坑指南:思科模拟器做链路聚合时,你可能会遇到的5个报错及解决方法
思科模拟器链路聚合实战:5个典型报错分析与精准排错指南 在Packet Tracer中配置链路聚合时,最令人头疼的往往不是基础配置步骤,而是那些突如其来的报错信息。上周有位学员在CCNA备考群里发了一张截图:%EC-5-CANNOT_BUNDLE2: Fa0/2…...
SPI总线抽象架构设计与实现
## 1. SPI总线抽象架构设计### 1.1 设计目标与架构分层 SPI总线抽象设计主要解决三个核心问题: 1. 总线与设备解耦:通过分层设计实现硬件无关性 2. 快速切换硬件/模拟SPI:统一接口规范支持多种实现方式 3. 跨平台移植性:核心逻辑与…...
别再只盯着RTK了!聊聊GNSS/INS组合导航里,紧耦合如何用1颗卫星‘吊住’你的定位
1颗卫星的逆袭:紧耦合技术如何在极端环境下守护你的定位精度 想象一下,你正驾驶一辆L4级自动驾驶汽车穿越曼哈顿的钢铁森林。高楼间的"城市峡谷"让GPS信号时断时续,传统导航系统已经开始报警——"卫星信号丢失"。但你的车…...
LSM303DLHC六轴IMU硬件设计与磁场校准实战指南
1. LSM303DLHC 器件概述与工程定位LSM303DLHC 是意法半导体(STMicroelectronics)推出的一款高集成度、低功耗的六轴惯性测量单元(6-DoF IMU),由独立封装的三轴加速度计(LIS3DH 兼容架构)和三轴磁…...
嵌入式系统中void指针与函数指针的高级应用
void指针与函数指针在嵌入式系统中的高级应用1. void指针的工程应用1.1 void指针的本质特性void指针(void*)在C语言中表示一个"不知道类型"的指针变量,其核心特性在于:int nums[] {3, 5, 6, 7, 9}; void* ptr1 nums; int* ptr2 (int*)nums;…...
OpenClaw安全指南:Qwen3-32B本地化部署的权限管控策略
OpenClaw安全指南:Qwen3-32B本地化部署的权限管控策略 1. 为什么需要特别关注OpenClaw的安全问题 第一次在本地部署OpenClaw时,我被它强大的自动化能力震撼了——这个AI助手能像真人一样操作我的电脑,从文件管理到网页浏览无所不能。但当我…...





