Java开发基础-JDBC-核心概念—02

内网(极空间)搭建gitlab跳板机转发端口及域名配置 然后,回头尝试用内网地址+15022 clone,成功,用公网的ip+15222 clone失败,那就是定位到时nginx转发的问题了。首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。然后,如上,我的80端口,映射15080,22端口映射15022。 阅读详情

在JDBC中对事物的处理方式:

Java JDBC事务机制

 首先,我们来看看现有JDBC操作会给我们打来什么重大问题,比如有一个业务:当我们修改一个信息后再去查询这个信息,看是这是一个简单的业务,实现起来也非常容易,但当这个业务执行中出错时,问题自然就出现了,比如当我们执行了一个修改过程中网络突然断掉或电脑死机掉电,,在问题修复后我们再执行查询,看到的信息就有可能与我们修改想要的不同【出错就不做修改,否则就修改】,为了解决这一问题,我们必须引入JDBC事务机制

下面通过简单的转账业务实例演示:

创建演示实例需要的数据库表

create table accounts (
	id varchar2(20),
	name varchar2(30),
	money number(11,2)
);

insert into accounts values('00001','张三',8000.0);
insert into accounts values('00002','李四',4000.0);
commit;

1.不使用事物管理:

public class TestDay03 {
	
	@Test
	public void test21(){
		//假设用户在ATM上输入了如下信息
		String payId = "00001";//付款账号
		String recId = "00002";//收款账号
		double mny = 1000.0;//转账金额
		
		Connection conn = null;
		try {
			conn = DBUtil.getConnection();
			//1.验证收款方账号是否存在
			String sql = "select * from ACCOUNTS "
					    +"where id= ?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, recId);
			ResultSet rs  = ps.executeQuery();
			if(!rs.next()){
				System.out.println("收款方账户不存在!");
				throw new SQLException("收款方账户不存在!");
			}
			//记录收款方余额,便于后面转账时+余额
			double recMoney = rs.getDouble("money");
			//2.验证付款方账户余额是否够用
			sql = "select * from ACCOUNTS "
				 +"where id= ?";
			ps = conn.prepareStatement(sql);
			ps.setString(1, payId);
			rs = ps.executeQuery();
			
			rs.next();
			double payMoney = rs.getDouble("money");
			
			
			if(payMoney<mny){
				System.out.println("余额不足!");
				throw new SQLException("余额不足!");
			}
			
			
			//3.付款方账户-n元
			sql ="update ACCOUNTS set "
				 +"money=? where id=?";
			ps = conn.prepareStatement(sql);
			ps.setDouble(1, payMoney-mny);
			ps.setString(2, payId);
			ps.executeUpdate();
			
			//假设此处有个错误
			Integer.valueOf("abc");
			
			//4.收款方账户+n元
			sql = "update accounts set "
				 +"money = ? where id=?";
			ps = conn.prepareStatement(sql);
			ps.setDouble(1, recMoney+mny);
			ps.setString(2, recId);
			ps.executeUpdate();
			
		} catch (Exception e) {	
			e.printStackTrace();
			throw new RuntimeException("转账失败!");
		}finally{
			DBUtil.close(conn);
		}
	}
	
}

使用Junit方式运行程序,可以看到控制台有报错信息


再看下数据库中数据是否收到影响导致数据不一致,很明显数据第一条数据修改了,而第二条却没有,两者之和少了1000


2.使用事物管理:

public class TestDay03 {
	
	/**
	 * 模拟转账 -学习jdbc中对事物的处理
	 * 1.验证收款方账号是否存在
	 * 2.验证付款方账户余额是否够用
	 * 3.付款方账户-n元
	 * 4.收款方账户+n元
	 */
	@Test
	public void test2(){
		//假设用户在ATM上输入了如下信息
		String payId = "00001";//付款账号
		String recId = "00002";//收款账号
		double mny = 1000.0;//转账金额
		
		Connection conn = null;
		try {
			conn = DBUtil.getConnection();
			//1.验证收款方账号是否存在
			String sql = "select * from ACCOUNTS "
					    +"where id= ?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, recId);
			ResultSet rs  = ps.executeQuery();
			if(!rs.next()){
				System.out.println("收款方账户不存在!");
				throw new SQLException("收款方账户不存在!");
			}
			//记录收款方余额,便于后面转账时+余额
			double recMoney = rs.getDouble("money");
			//2.验证付款方账户余额是否够用
			sql = "select * from ACCOUNTS "
				 +"where id= ?";
			ps = conn.prepareStatement(sql);
			ps.setString(1, payId);
			rs = ps.executeQuery();
			
			rs.next();
			double payMoney = rs.getDouble("money");
			
			
			if(payMoney<mny){
				System.out.println("余额不足!");
				throw new SQLException("余额不足!");
			}
			
			//设置手动管理事物(取消自动提交事物)
			conn.setAutoCommit(false);
			
			//3.付款方账户-n元
			sql ="update ACCOUNTS set "
				 +"money=? where id=?";
			ps = conn.prepareStatement(sql);
			ps.setDouble(1, payMoney-mny);
			ps.setString(2, payId);
			ps.executeUpdate();
			
			//假设此处有个错误
			Integer.valueOf("abc");
			
			//4.收款方账户+n元
			sql = "update accounts set "
				 +"money = ? where id=?";
			ps = conn.prepareStatement(sql);
			ps.setDouble(1, recMoney+mny);
			ps.setString(2, recId);
			ps.executeUpdate();
			
			//当转账流程正常结束时统一提交事物
			conn.commit();
		} catch (Exception e) {	
			//当转账过程中发生异常时回滚事物
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw new RuntimeException("事物回滚失败!");
			}
			
			e.printStackTrace();
			throw new RuntimeException("转账失败!");
		}finally{
			DBUtil.close(conn);
		}
	}
	
}

使用Junit方式运行程序,可以看到控制台有报错信息


再看下数据库中数据是否收到影响导致数据不一致,很明显没有,两条数据都没改变,之和也没变【程序错误,事物回滚了】


取消程序中的错误模拟,再次运行程序,控制台没有报错,数据库中数据修改正确!


在Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细) TinyWebServer是个什么项目?它是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器。使用线程池+非阻塞socket+epoll(ET和LT均实现) +事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机解析HTTP请求报文,支持解析GET和POST请求访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态。...... 阅读详情

相关推荐

西门子S7-1200模拟量的使用

模块类型核心参数输入信号处理输出信号配置转换原理数值范围TIA Portal配置编程要点 转换公式: 输出模拟量: 五、校准与线性化 硬件校准非线性补偿抗干扰措施数字滤波温度控制压力监控流量调节信号异常精度不足实践操作参考文档项目案例借鉴博客

weixin_51020122的博客 4774

Java开发基础-JDBC-核心概念—01

事务什么叫事务满足如下特征的数据库访问叫事务: 1. 原子性:事务是完整的,要么都成功,要么都失败。 2. 一致性:事务前后的数据要保持一致,即收支平衡。 3. 隔离性:事务过程中的数据不能被别人访问,需要受隔离/保护。 4. 持久性:事务一旦达成,就永久有效。JDBC对事务的支持自动管理事务JDBC自动管理事务,当调用executeUpdate()时,JDBC会自动提交事务。手动管理事务con....

Coder_Boy_的博客 229

【流复制环境PostgreSQL-14.1到PostgreSQL-16.1大版本升级】

PostgreSQL大版本会定期添加新特性,这些新特性通常会改变系统表的布局,但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。pg_upgrade升级主要有三种用法:1、使用pg_upgrade拷贝升级。2、使用pg_upgrade链接升级(带有- -link选项),- -link较快,但是启动新版本后修改了数据文件,再启动旧版本可能数据损坏,回滚较麻烦,所以尽量避免使用link参数进行升级。

小怪兽的博客 2926

2024年最全Java开发基础-JDBC-核心概念—02,深度剖析原理

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取System.out.println(“余额不足!”);

2401_84584740的博客 1002

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4410

Bode图、ABCD矩阵与EET结合:三步搞定复杂电路传递函数分析

在模拟电路与电源控制设计中,传递函数和频率响应是衡量系统稳定性的核心指标。Bode图以直观的幅频/相频曲线揭示带宽与相位裕度,ABCD二端口矩阵可将级联网络结构化表达,而EET额外元素定理则针对寄生电容、负载效应等局部修正提供显式公式。三者互补,组合成一套从整体拓扑到局部寄生修正的完整分析方法:先用ABCD搭建主体网络,再用EET快速加入额外元件,最后用Bode图验证传递函数和稳定裕度。该方法适用于滤波器设计、电源环路补偿、运放稳定性分析等线性小信号场景,支持Python/SciPy和SPICE交叉验证,显

weixin_32496547的博客 363

Java基础-JDBC

学习目标:了解java中jdbc的概念与使用方法

来自想要赚大钱的小周同学 3267

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 429

JDBC的概念以及核心六步

JDBC 概念 JDBC(Java DataBase Connectivity):Java连接数据库,可以使用Java语言连接数据库完成CRUD操作; CRUD:指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写; JDBC核心思想 Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式; 由...

Willing卡卡的博客 592

Vibe Coding 工具实战案例全解:Cursor、Claude Code、Codex 真实项目 30 分钟到 4 小时快速构建指南(2026 年最新)

2026年VibeCoding工具实战案例精选:1)使用Cursor在30分钟内构建现代TodoList应用(Next.js+TS+Tailwind);2)通过ClaudeCode纯终端2小时开发3D飞行射击游戏(Three.js+R3F);3)利用OpenAICodex多Agent并行4小时完成SaaS全栈开发(Next.js+Supabase+Stripe)。案例均来自真实项目,覆盖从入门到生产级开发,重点展示:自然语言Prompt技巧、迭代反馈方法、工具特性对比(Cursor可视化最佳/Claude推

hy行者勇哥的博客 3186

【Burp入门第三十一篇】Burp+SwitchyOmega实现本地localhost代理

在部分情况下(如本地靶场),当我们需要在Burp中查看、修改本地流量包的时候,按以下三个配置是不能得到本地流量包的。

等风来 3215

【Java】JDBC-基础篇

3.创建Java项目,在项目下创建Iib文件夹,将下载的驱动jar包复制到文件夹里。mysql版本要和jar包匹配,比如5.0的数据库要用5.0的驱动版本;推荐使用8.0.26之后的版本,因为8.0.25之前是要下载时区的。对象,可以向数据库发送SQL语句并获取执行结果。java中使用第三方jar或拓展都放在。进行实现,更安全、效率更高!5.JDBC核心6步;一般实际开发不使用。

yimeng_Sama的博客 2363

Python电梯II

输入数据有若干组(最多不超过1000组),每组数据的第一行为四个如题目中所示的整数N,u,d,s,由空格分隔开。第二行为不同楼层需要上下楼的请求, 最多不超过1000个。每个请求的格式为"from-to",其中"from"和"to"为所在楼层和要到达的楼层,保证from!=to。

沐风—云端行者 910

JDBC基础概念

JDBC代表Java数据库连接,用于Java编程语言和数据库之间的数据库连接的标准APIJDBC库包括常见的API有;连接到数据库,创建sql语句,在数据库中执行sql语句,查看和修改结果记录JDBC是一个连接数据库的规范,JDBC提供了一套接口取访问数据库Java程序员使用JDBC可以连接任何提供了JDBC驱动程 序的数据库系统创建与数据库的连接创建SQK或MySQL语句执行SQL或MySQL查询数据库查看和修改SQL所产生的记录核心 JAVA 编程。...

qq_43408367的博客 579

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java Web开发基础——数据库基础与JDBC

关系型数据库(RDBMS)是基于关系模型的数据管理系统,它使用表格(或称为关系)来存储数据,表格中的数据以行和列的形式组织,每一行表示一条记录,每一列表示一个属性。:PreparedStatement是Statement的子接口,用于执行预编译的SQL语句,它提供了更高的效率和更好的防止SQL注入的安全性。:JDBC驱动程序用于在Java应用程序和数据库之间建立连接,不同的数据库有不同的JDBC驱动(如MySQL、Oracle等)。:ResultSet用于保存查询的结果,返回的是一个数据库结果集。

好看资源网的博客 944

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Java】JDBC基础使用教程

JDBC一、JDBC简介 一、JDBC简介 JDBC 通过Java代码来操作数据库 实际工作中大部分的数据库操作,都是通过代码来完成的.格子编程语言都可以操作数据库,主要是数据库提供了各种版本的API(一组函数 / 一组类),调用这些API就可以操作数据库 ...

意愿三七 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java开发基础-JDBC-核心对象的使用—02(1)

在JDBC应用中,具有一定开发经验的开发者,就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。Statement的语句中,即使是相同一操作,因为数据内容不一样,每执行一次都要对传入的语句编译一次.效率低。select * from emp where ename= '随意' and sal = ' ';只要将参数直接传入编译过的语句执行代码中(相当于一个函数效果)就会得到执行,sql语句与参数混合拼接,可读性差,拼接sql语句易出错。

2401_84003690的博客 571

JDBC在Java项目开发中的核心作用与实战应用

JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口(API),它为Java开发者提供了与各种关系型数据库进行交互的统一方式。JDBC的核心价值提供与数据库无关的标准接口简化Java程序与数据库的交互过程支持多种关系型数据库(MySQL, Oracle, SQL Server等)成为Java EE企业级应用数据持久层的基石。

jnimiijabc的博客 1038

Java数据库基础与JDBC编程

1.背景介绍 1. 背景介绍 Java数据库基础与JDBC编程是一门重要的技术领域,它涉及到Java语言与数据库之间的交互和操作。数据库是现代应用程序中不可或缺的组成部分,它用于存储、管理和检索数据。Java数据库基础与JDBC编程技术可以帮助开发人员更好地处理数据库操作,提高开发效率和应用性能。 在本文中,我们将深入探讨Java数据库基础与JDBC编程的核心概念、算法原理、最佳实践、实际应...

AI天才研究院 923

JDBC基础

JDBC: Java Database Connectivity,意为Java数据库连接JDBC是java提供的一组独立于任何数据库管理系统的API。

2402_86577162的博客 707

Sharding-JDBC核心概念解析

前言 本篇文章会从Sharding-JDBC用途、使用场景、架构,Sharding-JDBC配置使用,Sharding-JDBC分库分表实战,Sharding-JDBC事务应用与数据治理等几个方面去解析Sharding-JDBC ;对于它来说和mycat的最大区别还是作为客户端数据中间件做为解决海量数据存储的方式。 官网:ShardingSphere (apache.org) Sharding-JDBC用途、使用场景、架构 说到Sharding-JDBC 一定要说到ShardingSphere。..

踩踩踩从踩的博客 1648

Java操作数据库 —— JDBC ① 基础篇

JDBC 就是使用Java语言操作关系型数据库的一套API全称:(JavaDataBaseConnectivity)意为Java 数据库连接// 在类中写入@Test,自动导入org.junit.Test,便不用重复写main函数// 单行单列查询@Test// 1.注册驱动// 2.获取连接// 用户名// 密码// 3.预编译SQL语句得到PreparedStatement对象// 4.执行语句 获取结果。

m0_73983707的博客 2027

Java开发基础-JDBC-核心对象的使用—02

在JDBC应用中,具有一定开发经验的开发者,就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。Statement的语句中,即使是相同一操作,因为数据内容不一样,每执行一次都要对传入的语句编译一次.效率低。select * from emp where ename= '随意' and sal = ' ';只要将参数直接传入编译过的语句执行代码中(相当于一个函数效果)就会得到执行,sql语句与参数混合拼接,可读性差,拼接sql语句易出错。

2501_90392025的博客 430

Java基础教程之JDBC

本文介绍了JDBC技术的基本概念和使用方法。JDBC是Java提供的数据库操作标准,包含四种连接形式:JDBC-ODBC桥接、本地驱动、网络驱动和协议驱动。文章详细讲解了使用DriverManager、Connection、Statement和PreparedStatement进行数据库增删改查操作的具体步骤,包括加载驱动、建立连接、执行SQL和释放资源。重点阐述了PreparedStatement相比Statement的优势,能够避免SQL注入问题。

小二丶的博客 820
上一篇: Java开发基础-JDBC-核心对象的使用—04
下一篇: Java开发基础-JDBC-核心对象的使用—05
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值