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

2024-06-10 03:04

本文主要是介绍GDPU Java 天码行空15 数据库编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验目的

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;}@Overridepublic 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:你的数据库URLString 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"); // pIDpstmt.setString(2, "E"); // pNamepstmt.setDouble(3, 60); // pPricepstmt.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','0');

② 编写转账代码

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

💖 BankTransfer.java

import java.sql.*;public class BankTransfer
{public static void main(String[] args){// 数据库连接信息String url = "jdbc:mysql://120.78.6.196:3306/productDB"; // 数据库URLString user = "root"; // 数据库用户名String password = "20080808"; // 数据库密码Connection conn = null;PreparedStatement pstmt = null;try{// 加载数据库驱动Class.forName("com.mysql.jdbc.Driver");// 建立数据库连接conn = DriverManager.getConnection(url, user, password);// 关闭自动提交conn.setAutoCommit(false);transfer(conn, pstmt, false);transfer(conn, pstmt, true);// 提交事务} catch (Exception e){try{if (conn != null){System.out.println("转账异常,事务回滚!");conn.rollback(); // 回滚事务queryBalance(conn);}} catch (SQLException se){se.printStackTrace();}e.printStackTrace();} finally{try{if (pstmt != null)pstmt.close();if (conn != null)conn.close();} catch (SQLException se){se.printStackTrace();}}}private static void transfer(Connection conn, PreparedStatement pstmt, boolean isException) throws SQLException{System.out.println("转账开始...");queryBalance(conn);// 1. 先扣减A的100String transferSQL = "UPDATE account SET balance = balance - ? WHERE account_id = ?";pstmt = conn.prepareStatement(transferSQL);pstmt.setDouble(1, 100); // 转出金额pstmt.setInt(2, 1); // 转出账户IDpstmt.executeUpdate();// 模拟转账延迟或异常if (isException){int a = 1 / 0;}// 2. 再增加B的100String depositSQL = "UPDATE account SET balance = balance + ? WHERE account_id = ?";pstmt = conn.prepareStatement(depositSQL);pstmt.setDouble(1, 100); // 转入金额pstmt.setInt(2, 2); // 转入账户IDpstmt.executeUpdate();conn.commit();System.out.println("转账成功");queryBalance(conn);System.out.println("转账结束\n");}private static void queryBalance(Connection conn) throws SQLException{// 查询A账户余额double balanceA_before = queryBalanceById(conn, 1);System.out.println("A账户余额: " + balanceA_before);// 查询B账户余额double balanceB_before = queryBalanceById(conn, 2);System.out.println("B账户余额: " + balanceB_before);}private static double queryBalanceById(Connection conn, int accountId) throws SQLException{String balanceQuery = "SELECT balance FROM account WHERE account_id = ?";try (PreparedStatement pstmt = conn.prepareStatement(balanceQuery)){pstmt.setInt(1, accountId);ResultSet rs = pstmt.executeQuery();if (rs.next()){return rs.getDouble("balance");}}return 0.0; // 如果没有找到账户,返回0}
}

运行结果

在这里插入图片描述

这篇关于GDPU Java 天码行空15 数据库编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047043

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项