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

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册,内容丰富全面&#xff0…...

如何将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…...