开启你的编程学习之旅

云课堂提供高质量的编程课程,从入门到精通,助你成为技术大牛

立即开始学习

Java 编程入门

作者: 赵老师 更新: 2024-03-18 阅读: 51234 难度: 初级
学习工具

6. Java 数据库编程

Java 通过 JDBC (Java Database Connectivity) 提供数据库连接和操作能力。

JDBC 基础操作

JDBC 数据库连接和 CRUD 操作
import java.sql.*; import java.util.ArrayList; import java.util.List; public class JDBCExample { private static final String URL = "jdbc:mysql://localhost:3306/testdb"; private static final String USERNAME = "root"; private static final String PASSWORD = "password"; static { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 获取数据库连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } // 创建用户表 public static void createUserTable() { String sql = "CREATE TABLE IF NOT EXISTS users (" + "id INT AUTO_INCREMENT PRIMARY KEY, " + "username VARCHAR(50) NOT NULL UNIQUE, " + "password VARCHAR(100) NOT NULL, " + "email VARCHAR(100), " + "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP" + ")"; try (Connection conn = getConnection(); Statement stmt = conn.createStatement()) { stmt.execute(sql); System.out.println("用户表创建成功"); } catch (SQLException e) { e.printStackTrace(); } } // 插入用户 public static boolean insertUser(User user) { String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getEmail()); int rows = pstmt.executeUpdate(); return rows > 0; } catch (SQLException e) { e.printStackTrace(); return false; } } // 查询所有用户 public static List getAllUsers() { List users = new ArrayList<>(); String sql = "SELECT * FROM users"; try (Connection conn = getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); user.setCreatedAt(rs.getTimestamp("created_at")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; } // 更新用户 public static boolean updateUser(User user) { String sql = "UPDATE users SET username = ?, password = ?, email = ? WHERE id = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getEmail()); pstmt.setInt(4, user.getId()); int rows = pstmt.executeUpdate(); return rows > 0; } catch (SQLException e) { e.printStackTrace(); return false; } } // 删除用户 public static boolean deleteUser(int userId) { String sql = "DELETE FROM users WHERE id = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, userId); int rows = pstmt.executeUpdate(); return rows > 0; } catch (SQLException e) { e.printStackTrace(); return false; } } } class User { private int id; private String username; private String password; private String email; private Timestamp createdAt; // 构造方法、getter 和 setter 方法 public User() {} public User(String username, String password, String email) { this.username = username; this.password = password; this.email = email; } // getter 和 setter 方法... public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Timestamp getCreatedAt() { return createdAt; } public void setCreatedAt(Timestamp createdAt) { this.createdAt = createdAt; } }

事务处理

JDBC 事务管理
import java.sql.*; public class TransactionExample { public static boolean transferMoney(int fromAccountId, int toAccountId, double amount) { Connection conn = null; try { conn = JDBCExample.getConnection(); // 关闭自动提交,开启事务 conn.setAutoCommit(false); // 检查转出账户余额是否足够 String checkBalanceSQL = "SELECT balance FROM accounts WHERE id = ?"; PreparedStatement checkStmt = conn.prepareStatement(checkBalanceSQL); checkStmt.setInt(1, fromAccountId); ResultSet rs = checkStmt.executeQuery(); if (rs.next()) { double currentBalance = rs.getDouble("balance"); if (currentBalance < amount) { System.out.println("余额不足"); conn.rollback(); return false; } } // 扣除转出账户金额 String deductSQL = "UPDATE accounts SET balance = balance - ? WHERE id = ?"; PreparedStatement deductStmt = conn.prepareStatement(deductSQL); deductStmt.setDouble(1, amount); deductStmt.setInt(2, fromAccountId); deductStmt.executeUpdate(); // 增加转入账户金额 String addSQL = "UPDATE accounts SET balance = balance + ? WHERE id = ?"; PreparedStatement addStmt = conn.prepareStatement(addSQL); addStmt.setDouble(1, amount); addStmt.setInt(2, toAccountId); addStmt.executeUpdate(); // 提交事务 conn.commit(); System.out.println("转账成功"); return true; } catch (SQLException e) { try { if (conn != null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); return false; } finally { try { if (conn != null) { conn.setAutoCommit(true); conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。