JDBC连接数据库案例

wen java案例 3

本文目录导读:

JDBC连接数据库案例

  1. 基础JDBC连接示例
  2. PreparedStatement 的使用(推荐)
  3. 连接工具类(最佳实践)
  4. 配置文件 db.properties
  5. 完整使用示例
  6. 使用连接池(HikariCP)
  7. 关键注意事项

我来为您提供一个完整的JDBC连接数据库案例,涵盖基础连接和最佳实践。

基础JDBC连接示例

准备工作(MySQL)

-- 创建数据库和表
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    age INT
);
INSERT INTO users (name, email, age) VALUES 
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);

添加MySQL驱动依赖(Maven)

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

基础连接代码

import java.sql.*;
public class JDBCBasicExample {
    public static void main(String[] args) {
        // 数据库连接参数
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
        String username = "root";
        String password = "your_password";
        // 1. 加载驱动(MySQL 8.0+ 可省略)
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return;
        }
        // 2. 建立连接
        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            System.out.println("数据库连接成功!");
            // 3. 创建Statement
            Statement stmt = conn.createStatement();
            // 4. 执行查询
            String sql = "SELECT * FROM users";
            ResultSet rs = stmt.executeQuery(sql);
            // 5. 处理结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                int age = rs.getInt("age");
                System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d%n", 
                    id, name, email, age);
            }
            // 6. 关闭资源(try-with-resources会自动关闭)
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

PreparedStatement 的使用(推荐)

import java.sql.*;
public class PreparedStatementExample {
    // 使用PreparedStatement防止SQL注入
    public static void insertUser(String name, String email, int age) {
        String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
        try (Connection conn = DatabaseUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
            // 设置参数
            pstmt.setString(1, name);
            pstmt.setString(2, email);
            pstmt.setInt(3, age);
            // 执行更新
            int affectedRows = pstmt.executeUpdate();
            if (affectedRows > 0) {
                // 获取自增ID
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    System.out.println("插入成功,生成的ID: " + rs.getInt(1));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 查询示例(带条件)
    public static void queryUsersByName(String keyword) {
        String sql = "SELECT * FROM users WHERE name LIKE ? OR email LIKE ?";
        try (Connection conn = DatabaseUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, "%" + keyword + "%");
            pstmt.setString(2, "%" + keyword + "%");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d%n",
                    rs.getInt("id"), 
                    rs.getString("name"), 
                    rs.getString("email"),
                    rs.getInt("age"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 事务处理示例
    public static void transactionExample() {
        Connection conn = null;
        try {
            conn = DatabaseUtils.getConnection();
            // 关闭自动提交
            conn.setAutoCommit(false);
            String sql1 = "UPDATE users SET age = age + 1 WHERE id = ?";
            String sql2 = "UPDATE users SET age = age - 1 WHERE id = ?";
            try (PreparedStatement pstmt1 = conn.prepareStatement(sql1);
                 PreparedStatement pstmt2 = conn.prepareStatement(sql2)) {
                // 转账操作:id=1减1岁,id=2加1岁
                pstmt1.setInt(1, 1);
                pstmt1.executeUpdate();
                pstmt2.setInt(1, 2);
                pstmt2.executeUpdate();
                // 提交事务
                conn.commit();
                System.out.println("事务提交成功");
            } catch (SQLException e) {
                // 回滚事务
                if (conn != null) {
                    conn.rollback();
                }
                System.out.println("事务回滚");
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.setAutoCommit(true); // 恢复自动提交
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

连接工具类(最佳实践)

import java.sql.*;
import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;
public class DatabaseUtils {
    private static String url;
    private static String username;
    private static String password;
    // 静态块,在类加载时执行
    static {
        try {
            // 从配置文件读取连接参数
            InputStream is = DatabaseUtils.class.getClassLoader()
                .getResourceAsStream("db.properties");
            Properties props = new Properties();
            props.load(is);
            url = props.getProperty("db.url");
            username = props.getProperty("db.username");
            password = props.getProperty("db.password");
            // 加载驱动
            Class.forName(props.getProperty("db.driver"));
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError("数据库配置加载失败!");
        }
    }
    // 获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
    // 关闭连接
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 重载方法,不需要ResultSet时使用
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);
    }
    // 测试连接
    public static boolean testConnection() {
        try (Connection conn = getConnection()) {
            return conn != null && !conn.isClosed();
        } catch (SQLException e) {
            return false;
        }
    }
}

配置文件 db.properties

# 数据库配置文件
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
db.username=root
db.password=your_password
# 连接池配置(如果使用连接池)
db.pool.maxSize=10
db.pool.minIdle=2
db.pool.maxWait=3000

完整使用示例

public class Main {
    public static void main(String[] args) {
        // 测试连接
        if (DatabaseUtils.testConnection()) {
            System.out.println("数据库连接测试成功");
        }
        // 查询所有用户
        System.out.println("=== 查询所有用户 ===");
        queryAllUsers();
        // 条件查询
        System.out.println("\n=== 按关键字搜索('zhang') ===");
        PreparedStatementExample.queryUsersByName("zhang");
        // 插入数据
        System.out.println("\n=== 插入新用户 ===");
        PreparedStatementExample.insertUser("赵六", "zhaoliu@example.com", 35);
        // 事务操作
        System.out.println("\n=== 事务示例 ===");
        PreparedStatementExample.transactionExample();
    }
    public static void queryAllUsers() {
        String sql = "SELECT * FROM users ORDER BY id";
        try (Connection conn = DatabaseUtils.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d%n",
                    rs.getInt("id"), 
                    rs.getString("name"), 
                    rs.getString("email"),
                    rs.getInt("age"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

使用连接池(HikariCP)

// 添加依赖
/*
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>
*/
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
public class ConnectionPoolExample {
    private static HikariDataSource dataSource;
    static {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false");
        config.setUsername("root");
        config.setPassword("your_password");
        config.setMaximumPoolSize(10);
        config.setMinimumIdle(2);
        config.setConnectionTimeout(30000);
        dataSource = new HikariDataSource(config);
    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    // 使用连接池
    public static void main(String[] args) {
        try (Connection conn = getConnection()) {
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM users");
            if (rs.next()) {
                System.out.println("用户总数: " + rs.getInt(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接池
            if (dataSource != null) {
                dataSource.close();
            }
        }
    }
}

关键注意事项

  1. 使用PreparedStatement:防止SQL注入攻击
  2. try-with-resources:自动关闭资源
  3. 事务管理:适当使用setAutoCommit(false)commit()
  4. 连接池:生产环境推荐使用连接池(HikariCP、Druid等)
  5. 异常处理:正确处理SQLException
  6. 配置文件:将数据库配置信息存储在单独配置文件
  7. 字符编码:设置characterEncoding=utf8处理中文

这就是完整的JDBC连接数据库案例,从基础连接到生产环境的最佳实践都有覆盖。

抱歉,评论功能暂时关闭!