当前位置: 首页 > 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)或高帧率&#…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...