GDPU Java 天码行空15 数据库编程

news2024/11/28 6:46:51

一、实验目的

1、 了解数据库的基础知识。
2、 掌握MySQL的下载、安装与配置。
3、 掌握MySQL可视化工具的使用。
4、 了解SQL语言。
5、 掌握JDBC中的API,并能进行简单的数据库操作。

二、实验内容

1、 安装MySQL

👨‍🏫 视频教程

2、建表 + 写数据

建立数据库productDB,再建立product表,然后按照下表输入记录,可以使用SQL语句或可视化工具实现。
在这里插入图片描述
SQL 脚本

USE productDB;
create table `product` (
	`pID` varchar (765),
	`pName` varchar (765),
	`pPrice` double ,
	`pNumber` int (11)
); 
insert into `product` (`pID`, `pName`, `pPrice`, `pNumber`) values('1001','A','30','88');
insert into `product` (`pID`, `pName`, `pPrice`, `pNumber`) values('1002','B','18','85');
insert into `product` (`pID`, `pName`, `pPrice`, `pNumber`) values('1003','C','25','68');
insert into `product` (`pID`, `pName`, `pPrice`, `pNumber`) values('1004','D','19','92');

3、Java 查询数据库

编程实现使用PreparedStatement查询product表中的所有记录,并将每一条记录保存到一个类Product的对象中,再将对象保存到ArrayList中,并打印ArrayList中的数据。

① 导入数据库驱动

在这里插入图片描述

② 编写代码

需要修改自己的数据库地址、用户名、密码

MySQLDemo.java

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

class Product implements Serializable
{
	private static final long serialVersionUID = 1L;
	private String pId;
	private String pName;
	private double pPrice;
	private Integer pNumber;

	public String getpId()
	{
		return pId;
	}

	public void setpId(String pId)
	{
		this.pId = pId;
	}

	public String getpName()
	{
		return pName;
	}

	public void setpName(String pName)
	{
		this.pName = pName;
	}

	public double getpPrice()
	{
		return pPrice;
	}

	public void setpPrice(double pPrice)
	{
		this.pPrice = pPrice;
	}

	public Integer getpNumber()
	{
		return pNumber;
	}

	public void setpNumber(Integer pNumber)
	{
		this.pNumber = pNumber;
	}

	public static long getSerialversionuid()
	{
		return serialVersionUID;
	}

	@Override
	public String toString()
	{
		return "Product [pId=" + pId + ", pName=" + pName + ", pPrice=" + pPrice + ", pNumber=" + pNumber + "]";
	}

}

public class MySQLDemo
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<Product> productList = new ArrayList<>();

		try
		{
			// 加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			// TODO:建立数据库连接(这个 url 需要更改个人数据库的信息)
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/productDB", "你的用户名", "你的密码");

			// 创建PreparedStatement查询所有记录
			String sql = "SELECT * FROM product";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();

			// 遍历结果集,创建Product对象并添加到列表中
			while (rs.next())
			{
				Product product = new Product();
				product.setpId(rs.getString("pID"));
				product.setpName(rs.getString("pName"));
				product.setpPrice(rs.getDouble("pPrice"));
				product.setpNumber(rs.getInt("pNumber"));
				productList.add(product);
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		} finally
		{
			// 关闭资源
			try
			{
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException se)
			{
				se.printStackTrace();
			}
		}

		// 打印ArrayList中的数据
		for (Product product : productList)
		{
			System.out.println(product);
		}
	}
}

运行结果
在这里插入图片描述

4、 编程实现插入记录

pID=1005,pName=E,pPrice=60,pNumber=65

需要修改自己的数据库地址、用户名、密码

💖 InsertProduct.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class InsertProduct
{
	public static void main(String[] args)
	{
		// 数据库连接信息
		String url = "jdbc:mysql://127.0.0.1:3306/productDB"; // TODO:你的数据库URL
		String user = "root"; // TODO:你的数据库用户名
		String password = ""; // TODO:你的数据库密码

		// SQL插入语句
		String insertSQL = "INSERT INTO product (pID, pName, pPrice, pNumber) VALUES (?, ?, ?, ?)";

		// 使用try-with-resources自动关闭资源
		try (Connection conn = DriverManager.getConnection(url, user, password);
				PreparedStatement pstmt = conn.prepareStatement(insertSQL))
		{

			// 设置插入数据
			pstmt.setString(1, "1005"); // pID
			pstmt.setString(2, "E"); // pName
			pstmt.setDouble(3, 60); // pPrice
			pstmt.setInt(4, 65); // pNumber

			// 执行插入操作
			int rowsAffected = pstmt.executeUpdate();
			System.out.println("插入了 " + rowsAffected + " 行数据。");
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

✨ 运行结果

在这里插入图片描述

5、 Java程序中使用事务,模拟实现银行转账功能

① 新建 account

USE productDB;
create table `account` (
	`account_id` varchar (765),
	`balance` double 
); 
insert into `account` (`account_id`, `balance`) values('1','1000');
insert into `account` (`account_id`, `balance`) values('2','200');

② 编写转账代码

需要修改自己的数据库地址、用户名、密码

💖 BankTransfer.java

import java.sql.*;

public class BankTransfer
{
	public static void main(String[] args)
	{
		// 数据库连接信息
		String url = "jdbc:mysql://127.0.0.1:3306/productDB"; // 数据库URL
		String user = "root"; // 数据库用户名
		String password = ""; // 你的数据库密码
		Connection conn = null;
		PreparedStatement pstmt = null;

		try
		{
			// 加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 建立数据库连接
			conn = DriverManager.getConnection(url, user, password);

			// 关闭自动提交
			conn.setAutoCommit(false);
//			A 转 100 给 B

			// 1. 先扣减 A 的 100
			String transferSQL = "UPDATE account SET balance = balance - ? WHERE account_id = ?";
			pstmt = conn.prepareStatement(transferSQL);
			pstmt.setDouble(1, 100); // 转出金额
			pstmt.setInt(2, 1); // 转出账户ID
			pstmt.executeUpdate();

			// 模拟转账延迟或异常
			// ...
			int a = 10 / 0; // 无异常就可以正常转账,有异常则回滚

			// 2. 再增加 B 的 100
			String depositSQL = "UPDATE account SET balance = balance + ? WHERE account_id = ?";
			pstmt = conn.prepareStatement(depositSQL);
			pstmt.setDouble(1, 100); // 转入金额
			pstmt.setInt(2, 2); // 转入账户ID
			pstmt.executeUpdate();

			// 提交事务
			conn.commit();
		} catch (Exception e)
		{
			try
			{
				if (conn != null)
				{
					conn.rollback(); // 回滚事务
				}
			} catch (SQLException se)
			{
				se.printStackTrace();
			}
			e.printStackTrace();
		} finally
		{
			try
			{
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException se)
			{
				se.printStackTrace();
			}
		}
	}
}
  • 转账过程出现异常,事务回滚,数据库账户余额不变

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成刷题一轮(包过版)

搭配食用 计算机组成原理一轮-CSDN博客 目录 一、计算机系统概述 选择 计算机系统组成 冯诺依曼机 软件和硬件的功能 CPU等概念 计算机系统的工作原理 机器字长 运行速度 求MIPS 编译程序 机器语言程序 平均CPI和CPU执行时间 综合应用 存储程序原理 二…

线性预测器的等价性

摘要 尽管线性模型很简单&#xff0c;但它在时间序列预测中表现良好&#xff0c;即使是在与更深入、更昂贵的模型竞争时也是如此。已经提出了许多线性模型的变体&#xff0c;通常包括某种形式的特征归一化&#xff0c;以提高模型的泛化。本文分析了用这些线性模型体系结构可表…

学生宿舍人走断电系统的开发

学生宿舍人走断电管理系统是一款智能化的电力管理设备&#xff0c;旨在解决学生宿舍用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人&#xff0c;当无人时自动断电&#xff0c;避免能源浪费和事故的发生。 2.:系统具有过载保护、短路保护、过…

基于51单片机的串口乒乓球小游戏

基于51单片机的乒乓球小游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用两块单片机串口进行通信&#xff1b; 2.一排LED模拟乒乓球运动&#xff08;哪里亮表示运动到哪&#xff09;&#xff1b; 3.当最左边LED亮&#xff0c;表示球…

C 语言实现Linux终端显示IP二维码

调试信息&#xff1a;开发者可以在终端生成二维码&#xff0c;包含调试信息或日志数据&#xff0c;便于移动设备扫描和查看。设备配置&#xff1a;物联网设备配置时&#xff0c;通过终端生成配置二维码&#xff0c;扫描后进行设备配置。 Ubuntu/Debian 环境安装二维码库 sudo a…

以无厚,入有间,做一件事为什么靠努力不行,不能长期维持

庖丁解牛&#xff0c;并不是在说人和技巧&#xff0c;而是在说解牛不在于刀的锋利&#xff0c;而是怎样才能做到让刀不产生损耗&#xff0c;就是熟悉牛肉纹路&#xff0c;按照纹路和肉骨间隙进行操刀。这就是尊重自然规律&#xff0c;对于人也是一样的&#xff0c;如果所有事情…

C# .NET 异步实现方式

一、异步编程模式 .NET 提供了执行异步操作的三种模式&#xff1a; 基于任务的异步模式 (TAP) &#xff0c;该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 …

Day47 代码随想录打卡|二叉树篇---最大二叉树

题目&#xff08;leecode T654&#xff09;&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 …

linux常用命令及其选项

1、常用命令 1.1、ls 选项说明-a显示所有文件及目录 (包括隐藏文件)-i显示inode-A同 -a选项 &#xff0c;但不列出 "." (目前目录) 及 ".." (父目录)-l列出信息详细(如文件型态、权限、拥有者、文件大小等)-R递归显示(若目录下有文件&#xff0c;则以下之…

盘点 2024 Google I/O 中的 Android 方向关键更新

这里写自定义目录标题 前言1. AI 编程助手2. 生成式AI 应用3. 不同屏幕尺寸适配4. 桌面小部件&#xff08;Widget&#xff09;5. 跨设备类型开发6. WearOS & 可穿戴7. Android for Car8. Android TV9. Google Home API10. Kotlin Multiplatform11. Jetpack Compose12. Andr…

C# Excel操作类EPPlus

摘要 EPPlus 是一个流行的用于操作 Excel 文件的开源库&#xff0c;适用于 C# 和 .NET 环境。它提供了丰富的功能&#xff0c;能够轻松地读取、写入和格式化 Excel 文件&#xff0c;使得在 C# 中进行 Excel 文件处理变得更加简单和高效。EPPlus 不需要安装 Microsoft Office 或…

【机器学习基础】Python编程10:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言&#xff0c;它在机器学习领域中的重要性主要体现在以下几个方面&#xff1a; 简洁易学&#xff1a;Python语法简洁清晰&#xff0c;易于学习&#xff0c;使得初学者能够快速上手机器学习项目。 丰富的库支持&#xff1a;Python拥有大量的机…

ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)

ChatTTS&#xff08;Chat Text To Speech&#xff09;是专为对话场景设计的文本生成语音(TTS)模型&#xff0c;特别适用于大型语言模型(LLM)助手的对话任务&#xff0c;以及诸如对话式音频和视频介绍等应用。它支持中文和英文&#xff0c;还可以穿插笑声、说话间的停顿、以及语…

不确定性+电动汽车!含高比例新能源和多类型电动汽车的配电网能量管理程序代码!

前言 能源供应的可持续性和清洁性是当今世界共同关注的议题&#xff0c;配电网与可再生能源发电相结合&#xff0c;通过多能互补和梯级利用&#xff0c;在不同时空取长补短&#xff0c;提高能源利用率&#xff0c;减少温室气体排放&#xff0c;是解决能源短缺和环境问题的有效…

MicroPython esp32 连接wifi 配网

整体流程&#xff1a; 1&#xff09;开启STA 和 AP 模式 2&#xff09;扫描周围wifi 保存在 变量 wifi_list&#xff08;后面要用到&#xff09; 3) 尝试STA模式连接Wifi&#xff0c;并查寻状态。 4) 如果STA 无法连网&#xff0c;就用AP模式&#xff0c;创建热点。 5&a…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性&#xff0c;使得编写和维护汇编程序更加方便&#xff1b;在 MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;宏的定义和使用非常常见。以下是对汇编语…

【GD32F303红枫派使用手册】第十一节 ADC-电源电压单通道ADC检测实验

11.1 实验内容 通过本实验主要学习以下内容&#xff1a; ADC的简介 GD32F303 ADC工作原理 查询方式实现ADC单通道采样 11.2 实验原理 11.2.1 ADC原理 我们知道&#xff0c;自然界中有非常多的模拟信号&#xff0c;比如上一节提到的光照强度&#xff0c;还有其他的例如温…

【网络编程开发】10.UNIX套接字域

10.UNIX套接字域 UNIX域套接字是用于在同一台计算机上运行的进程之间进行通信的一种机制。它与传统基于TCP/IP协议栈的套接字不同&#xff0c;UNIX域套接字操作更为高效&#xff0c;因为它避免了网络层的开销&#xff0c;不涉及网络报头、检验和、顺序号等复杂的网络协议处理过…

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后,越来越难了,教程上的内容不仅全还细,几乎任何内容都有可能考,出题老师主打一个出其不意,比如2024年5月考试,连UML时序图的片段都考,这 种如果看书的话一般都是一瞟而过,而实际工作中又很少会这么严格的去画片段。 所以对于教程上的…

VB7/64位VB6开发工具office插件开发-twinbasic

全新的VB7&#xff0c;twinbasic&#xff0c;支持64位开发&#xff0c;支持EXCEL插件开发&#xff0c;老外连续3年闭关修练终成正果 官方最新版下载&#xff1a;https://github.com/twinbasic/twinbasic/releases 汉化工具用法&#xff1a;把工具和Lang_Tool目录复制到Twinbasi…