MySQL基础四(JDBC)
JDBC(重点)
数据库驱动

程序会通过数据库驱动,和数据库打交道。
sun公司为了简化开发人员对数据库的统一操作,提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说,只需要掌握JDBC接口。

熟悉java.sql与javax.sql包,导入一个数据库驱动包
1.在数据库中提前创建users表,准备连接jdbc


2.查询数据库版本,下载对应jar包。


3.将jar包导入项目。

4.导入jar后,需要添加到库里面。如下操作:

5.不需要更改信息,直接点击ok。

6.创建项目,连接数据库
- 加载驱动
- 提供用户信息与url
- 连接地址+ssl连接关闭+字符集为utf-8+时区设置
- 连接数据库,DriverManager
- 执行SQL对象, Statement对象
- 使用sql语言执行sql对象
- 释放连接
//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//固定写法//用户信息和url,url基本格式如下://连接地址+ssl连接关闭+字符集为utf-8+时区设置String url="jdbc:mysql://localhost:3306/learndb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";String username="root";String password="123456";//连接成功,会返回数据库对象 Connection代表数据库Connection connection = DriverManager.getConnection(url, username, password);//执行SQL的对象 StatementStatement statement = connection.createStatement();//执行SQL的对象去执行SQl,可能存在结构,查看返回结果String sql="SELECT * from `users`";ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部的查询结果while (resultSet.next()){System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("name"));System.out.println("pwd="+resultSet.getObject("password"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birth="+resultSet.getObject("birthday"));}//释放连接resultSet.close();statement.close();connection.close();}

JDBC对象分析
- DriverManger
//加载驱动:法一:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
//法二:Class.forName("com.mysql.cj.jdbc.Driver"); //固定写法
//connection是数据库
//数据库设置为自动提交、事务提交、事务回滚
connection.rollback();
connection.commit();
connection.setAutoCommit();
- URL
mysql默认 端口号为3306,url写法:
jdbc://mysql:/主机地址:端口号/数据库名?参数1&参数2¥参数3
String url="jdbc:mysql://localhost:3306/learndb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
- Statement 执行类,执行SQL的对象
//编写SQL
String sql="SELECT * from `users`";
//可执行的方法
statement.executeQuery(); //执行查询,返回一个结果集
statement.execute() //执行任何SQL
statement.executeUpdate() //执行更新、插入、删除,返回一个受影响的行数
- ResultSet查询结果集,封装了所有的查询结果
获得指定的数据类型
resultSet.getObject(); //在不知道列类型的情况下使用
resultSet.getstring(); //如果知道列的类型就使用指定的类
resultSet.getInt();
resultSet.getFloat();
resultSet.getDate();
resultSet.getObject();
- 遍历、指针
resultSet.beforeFirst(); //移动到最前面
resultSet.afterLast(); //移动到最后面
resultSet.next(); //移动到下一个数据
resultSet.previous(); //移动到前一行
resultSet.absolute(); //移动到指定行
- 释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源、用完即关
statement对象
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删查改,只需要通过这个对象想数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将回返回一个整数(即增删改语句导致了数据库几行是数据发生了变化)。
Statement.excuteQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
前提:
在src目录下创建资源文件,在该文件内部填写数据库用户信息与url等资源信息。

创建一个工具类,完成加载驱动、连接数据库、释放资源等作用。

//工具类
public class JdbcUtils {//提升作用域private static String driver=null;private static String url=null;private static String username=null;private static String password=null;static {try{//通过反射获得具体的资源。getResourceAsStream("db.properties")从该文件获得资源//读取信息InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);//获取具体的资源driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");//驱动只用加载一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//获取连接的方法public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,username,password);}//释放连接资源的方法public static void release(Connection conn, Statement st, ResultSet rs){if (rs!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (st!=null){try {st.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn!=null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}
代码详解
1.获取资源、加载驱动、连接数据库


增删改的方法:都用executeUpdate
插入数据
//插入数据
public class TestInsert {public static void main(String[] args) {//提升作用域Connection conn=null;Statement st=null;ResultSet rs=null;try {conn = JdbcUtils.getConnection();//获取数据库连接st=conn.createStatement();//获取sql的执行对象String sql="insert into `users`(`id`,`name`,`password`,`email`,`birthday`)" +"values(4,'serenity','123456','4563@qq.com','2020-01-01')";int i=st.executeUpdate(sql);//执行sql代码完成更新表,返回的结果为受影响的行数if (i>0){System.out.println("插入成功");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {JdbcUtils.release(conn,st,rs);//调用工具类,释放资源}}
}

插入成功标志:

删除数据:
主要是更改sql代码

//删除数据
public class TestDelete {public static void main(String[] args) {//提升作用域Connection conn=null;Statement st=null;ResultSet rs=null;try {conn = JdbcUtils.getConnection();//获取数据库连接st=conn.createStatement();//获取sql的执行对象String sql="DELETE FROM users where id=4";int i=st.executeUpdate(sql);//执行sql代码完成更新表,返回的结果为受影响的行数if (i>0){System.out.println("删除成功");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {JdbcUtils.release(conn,st,rs);//调用工具类,释放资源}}
}

更改数据

查看数据:利用executeQuery

PrepareStatement对象
PrepareStatement可以防止SQL注入,效率更好。把传递进来的参数当做字符
假设参数中存在转义字符,如引号,会被直接转义。
- 新增

- 删除

- 更新

- 查询

idea连接数据库




若未成功,可修改版本。


连接上数据库后


选择数据库后,可双击打开数据库表中查看信息。



事务
要么都成功,要么都失败
ACID原则
- 原子性:要么全部完成,要么都不完成
- 一致性:总数不变
- 隔离性:多个进程互不干扰
- 持久性:一旦提交不可逆,持久化到数据库
隔离性的问题:
脏读:一个事务读取另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出来结果不一致
前提:


模拟事务:A给B转账
public class TestTransation01 {public static void main(String[] args) {Connection conn=null;PreparedStatement st=null;ResultSet rs=null;try {//加载驱动conn= JdbcUtils.getConnection();//关闭数据库的自动提交,自动会开启事务conn.setAutoCommit(false);//开启事务//模拟A给B转账String sql1="update account set money=money-100 where name='A'";st=conn.prepareStatement(sql1);st.executeUpdate();String sql2="update account set money=money+100 where name='B'";st=conn.prepareStatement(sql2);st.executeUpdate();//业务完毕,提交事务conn.commit();System.out.println("成功!");} catch (SQLException throwables) {try {conn.rollback();//如果失败则回滚事务} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();}finally {//释放资源JdbcUtils.release(conn,st,rs);}}
}
代码解释:

模拟事务A与B转账出现异常:

相关文章:
MySQL基础四(JDBC)
JDBC(重点) 数据库驱动 程序会通过数据库驱动,和数据库打交道。 sun公司为了简化开发人员对数据库的统一操作,提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说,只需要掌握JDBC接口。 熟悉java.sql与javax.s…...
审批流AntV框架蚂蚁数据可视化X6饼图(注释详尽)
大家好,这次使用的是AntV的蚂蚁数据可视化X6框架,类似于审批流的场景等,代码如下: X6框架参考网址:https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址,直接复制下方代码进行调试…...
用Python之requests库调用大模型API实现多轮对话
文章目录 1. 多轮对话实现概述2. 多轮对话全上下文实现3. 多轮对话最近上下文的链式实现4. 总结 1. 多轮对话实现概述 多轮对话功能可以让大模型“拥有记忆”,满足如追问、信息采集等需要连续交流的场景。 AI大模型API 不会记录您的对话历史记录。如果您需要让大模…...
《异步江湖:XHR、Promise 与 Event Loop 的恩怨情仇》
XMLHttpRequest XMLHttpRequest(简称 XHR)是浏览器提供的一个 JavaScript 对象,用于在客户端和服务器之间发送 HTTP 请求。它是实现 AJAX(Asynchronous JavaScript and XML) 技术的核心工具,允许网页在不…...
【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118205 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的? 2.4讲了导航相关的流程,那导航被提交后又会怎么样呢? 就进入了渲染阶段。 这…...
蓝桥杯第15届真题解析
由硬件框图可以知道我们要配置LED 和按键、lcd,解决lcd引脚冲突 LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 按键 按键配置,由原理图按键所对引…...
19c rac-expdp备份异常处理
客户反馈,有套19c rac环境,补丁是19.13的,有1个节点使用expdp备份用户异常,报错如下 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production ORA-31626: job does not exist ORA-31637: cannot…...
轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题
这篇博文主要为大家讲解关于sd webui的部署问题,大家有什么不懂的可以随时问我,如果没有及时回复,可联系:1198965922 如果后续大家需要了解怎么用代码调用部署好的webui的接口,可以在评论区留言哦,博主可以…...
20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式
20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起:128GB的TF卡,只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下,NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…...
AIP-159 跨集合读
编号159原文链接AIP-159: Reading across collections状态批准创建日期2019-07-26更新日期2019-07-26 有时,用户需要跨集合检索资源,或者在不知道资源所在集合的情况下检索单个资源。 指南 API 可以 在标准 List 方法中允许用户使用 - (连…...
C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现
文章目录 引入1.位图的介绍1.1位图的概念1.2位图的应用1.3bitset的基本使用bitset的定义方式bitset成员函数的使用 2.位图的基本模拟实现2.1基本结构2.2构造函数2.3set函数2.4reset2.5test 3.位图考察题目3.1只出现⼀次的整数?3.2找到两个文件交集?3.3出…...
清北deepseek8本手册
“清北手册”通常是“清华大学和北京大学推出的DeepSeek手册”的简写。近期,随着AI技术的迅速发展,清北两高校陆续发布多本自家的DeepSeek学习手册,助力普通人学习进阶。 清华大学的DeepSeek手册已推出5册,内容丰富全面࿰…...
如何将Promise.then中的值直接return出来
Promise 如何返回值,而不是返回 Promise 对象。实际开发中使用封装好的异步请求函数,为什么调用该函数返回的值一直都是 undefined。 一、需求 定义一个 foo 函数,在里面执行异步操作,然后取得 Promise.then 中的值并 return 出来…...
利用golang embed特性嵌入前端资源问题解决
embed嵌入前端资源,配置前端路由的代码如下 func StartHttpService(port string, assetsFs embed.FS) error {//r : gin.Default()gin.SetMode(gin.ReleaseMode)r : gin.New()r.Use(CORSMiddleware())// 静态文件服务dist, err : fs.Sub(assetsFs, "assets/di…...
SPI驱动(二) -- SPI驱动程序模型
文章目录 参考资料:一、SPI驱动重要数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI驱动数据结构 二、SPI 驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、总结 参考资料: 内核头文件:include\linux\spi\spi.h 一、SPI驱…...
【无标题】FrmImport
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)四、项目展示五、资源链接 前言 我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的…...
深入浅出 Go 语言:协程(Goroutine)详解
深入浅出 Go 语言:协程(Goroutine)详解 引言 Go 语言的协程(goroutine)是其并发模型的核心特性之一。协程允许你轻松地编写并发代码,而不需要复杂的线程管理和锁机制。通过协程,你可以同时执行多个任务,并…...
vLLM代码推理Qwen2-VL多模态
由于近期代码微调以及测试都是在远程服务器上,因此LLamafactory-cli webui 以及vLLM的ui均无法使用,因此不断寻求解决方案,我提供一个解决方案,LLamafactory微调完成的模型需要合并为一个完整模型后再使用vLLM进行代码推理测试微调…...
DNS云解析有什么独特之处?
在数字化浪潮中,每一次网页点击、视频加载或在线交易背后,都依赖着域名系统(DNS)的高效运转。传统DNS架构的局限性(如单点故障、延迟高、安全脆弱)在云计算时代被彻底颠覆,DNS云解析作为新一代解…...
视频流畅播放相关因素
视频播放的流畅度是一个综合性问题,涉及从视频文件本身到硬件性能、网络环境、软件优化等多个环节。以下是影响流畅度的关键因素及优化建议: 一、视频文件本身 1. 分辨率与帧率 1.问题:高分辨率(如4K)或高帧率&#…...
MoneyPrinterPlus智能视频创作工具实战指南:从零到批量生产的完整流程
MoneyPrinterPlus智能视频创作工具实战指南:从零到批量生产的完整流程 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhispe…...
AI迈向“自动驾驶”,零售回归“人间清醒”:2026商业底层逻辑正在重组
导读:2026年的初夏,商业世界正处在一个奇妙的交汇点。一边是AI编程正式宣告进入“无人驾驶”时代,生产力工具迎来质变;另一边,零售巨头们在狂热中开始自省,重新审视效率与人性的边界。从阿里、腾讯的智能体…...
PSoC Creator开发实战:从组件配置到自定义模块设计
1. 项目概述与核心价值 作为一名在嵌入式领域摸爬滚打了十多年的老工程师,我接触过不少开发工具和平台。今天想和大家深入聊聊赛普拉斯(Cypress,现为英飞凌旗下)的 PSoC Creator 这款集成开发环境(IDE)。…...
从GLIBCXX_3.4.29缺失到系统库兼容性:一次深度排错与修复实践
1. 当你的程序突然罢工:GLIBCXX_3.4.29缺失的背后故事 那天我正在部署一个机器学习模型服务,突然终端弹出鲜红的报错:"libstdc.so.6: version GLIBCXX_3.4.29 not found"。这个错误看似简单,却让我花了整整一个下午才彻…...
Adobe-GenP 3.0终极指南:5分钟快速免费激活Adobe全系列软件
Adobe-GenP 3.0终极指南:5分钟快速免费激活Adobe全系列软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款革命性的Adobe Creative Cl…...
抖音去水印下载器终极指南:批量保存视频、音乐、图集和直播
抖音去水印下载器终极指南:批量保存视频、音乐、图集和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
从SPI到QSPI:你的Flash读写速度慢?可能是模式没选对(以W25Q128JV为例)
从SPI到QSPI:解锁W25Q128JV Flash的隐藏性能 在嵌入式系统开发中,存储器的读写速度往往是制约整体性能的关键瓶颈。许多工程师在使用常见的SPI Flash芯片如W25Q128JV时,可能已经习惯了标准的SPI接口操作,却不知道通过简单的模式切…...
CVBS转BT656/BT601,能成熟、应用广泛的低功耗视频解码器
GM7150是一款低功耗、9位NTSC/PAL视频解码器,由成都振芯科技股份有限公司生产。该芯片采用CMOS工艺,通过IC总线与PC或DSP相连构成应用系统。它内部包含1个模拟处理通道,能实现CVBS、S-Video视频信号源选择、A/D转换、自动钳位、自动增益控制(…...
【亲测免费】 GeoMatch_src:基于边缘的模板匹配技术
GeoMatch_src:基于边缘的模板匹配技术 【下载地址】GeoMatch_srcVS2015OpenCV3.3版说明文档 本仓库提供了**GeoMatch_src**项目的更新版本,专为使用Visual Studio 2015和OpenCV 3.3环境的开发者设计。GeoMatch_src是一个基于边缘的模板匹配技术实现&…...
CLI-Anything与MCP服务器:打造强大后端的实战教程
CLI-Anything与MCP服务器:打造强大后端的实战教程 【免费下载链接】CLI-Anything "CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/ 项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything CLI-A…...
