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; } @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 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','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"; // 数据库URL String 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的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(); // 模拟转账延迟或异常 if (isException) { int a = 1 / 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(); 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 } }
运行结果
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。