本文目录导读:

我来为您提供一个完整的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();
}
}
}
}
关键注意事项
- 使用PreparedStatement:防止SQL注入攻击
- try-with-resources:自动关闭资源
- 事务管理:适当使用
setAutoCommit(false)和commit() - 连接池:生产环境推荐使用连接池(HikariCP、Druid等)
- 异常处理:正确处理SQLException
- 配置文件:将数据库配置信息存储在单独配置文件
- 字符编码:设置
characterEncoding=utf8处理中文
这就是完整的JDBC连接数据库案例,从基础连接到生产环境的最佳实践都有覆盖。