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}
}

运行结果

在这里插入图片描述

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

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

相关文章

华为云加码数智升级 赋能山西培育新质生产力

加码企业数智升级&#xff0c;驱动山西新质生产力跃升。6月4日&#xff0c;“云上共创晋而有为”华为云山西数智升级思享会在山西智创城NO.1创新孵化基地举办。 活动由华为云计算技术有限公司主办&#xff0c;太原清控科创科技园管理有限公司协办。活动整合山西鲲鹏生态创新中…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

Cocos2dx 编译游戏安装包制作教程

在本教程中&#xff0c;我们将学习如何为 Visual Studio 编译项目配置图标&#xff0c;并使用 Inno Setup 创建安装包。我们将包括以下部分&#xff1a; 设置项目图标&#xff1a;在 Visual Studio 中配置 .exe 文件的图标&#xff0c;或者使用第三方工具替换编译后的图标。创…

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档&#xff09; 帮助多名同学上岸LLM方向&#xff0c;包括高校副教授&#xff0c;北美PhD&#xff0c;大厂等 课程名称【手撕LLMRLHF】 授课形式&#xff1a;在线会议直播讲解课后录播 时间&…

RK3568笔记三十一:ekho 6.3 文本转语音移植

若该文为原创文章&#xff0c;转载请注明原文出处。 移植的目的是在在OCR识别基础上增加语音播放&#xff0c;把识别到的文字直接转TTS播报出来&#xff0c;形成类似点读机的功能。 1、下载文件 libsndfile-1.0.28.tar.gz ekho-6.3.tar.xz 2、解压 tar zxvf libsndfile-1.0…

LangChain基础知识入门

LangChain的介绍和入门 1 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月&#xff0c;它是围绕LLMs&#xff08;大语言模型&#xff09;建立的一个框架&#xff0c;LLMs使用机器学习算法和海量数据来分析和理解自然语言&#xff0c;GPT3.5、GPT4是LLMs最先进的代…

【源码】Spring Data JPA原理解析之事务注册原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

Docker 基础使用 (4) 网络管理

文章目录 Docker 网络管理需求Docker 网络架构认识Docker 常见网络类型1. bridge 网络2. host 网络3. container 网络4. none 网络5. overlay 网络 Docker 网路基础指令Docker 网络管理实操 其他相关链接 Docker 基础使用(0&#xff09;基础认识 Docker 基础使用(1&#xff09;…

文件操作(Python和C++版)

一、C版 程序运行时产生的数据都属于临时数据&#xff0c;程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…

Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头

匹配响应执行状态 我们创建了测试环境 而且发送了虚拟的请求 我们接下来要进行验证 验证请求和预期值是否匹配 MVC结果匹配器 匹配上了 匹配失败 package com.example.demo;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Auto…

Transformer动画讲解:Softmax函数

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议&#xff0c;它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…

UV胶的均匀性对产品质量有什么影响吗?

UV胶的均匀性对产品质量有什么影响吗? UV胶的均匀性对产品质量具有显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 粘合强度&#xff1a;UV胶的均匀性直接影响其粘合强度。如果UV胶分布不均匀&#xff0c;可能导致部分区域粘接力不足&#xff0c;从而影响产品的…

报错:CMake Error OpenCVConfig.cmake opencv-config.cmake

1、编译过程中&#xff0c;出现OpenCV 报错问题 报错&#xff1a;CMake Error OpenCVConfig.cmake opencv-config.cmake 解决思路&#xff1a;参考此链接

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点&#xff0c;其次详细阐述了Flask项目的部署流程&#xff0c;涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…