本文目录导读:

我来为您提供一个完整的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连接数据库案例,从基础连接到生产环境的最佳实践都有覆盖。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播