上一篇
使用JDBC连接数据库,需先选DBMS(如MySQL),配驱动,编SQL语句
建立Java数据库的完整指南
建立Java数据库需要结合数据库管理系统(DBMS)与Java编程语言,通过JDBC(Java Database Connectivity)或ORM框架实现数据的存储与操作,以下是系统性的操作方案:
环境准备与工具选择
| 类别 | 选项 | 适用场景 |
|---|---|---|
| 数据库类型 | MySQL、PostgreSQL、SQLite | 小型项目(SQLite)、高并发(MySQL/PostgreSQL)、企业级(Oracle) |
| Java版本 | Java 8+(推荐Java 17+) | 兼容主流JDBC驱动 |
| 开发工具 | IntelliJ IDEA/Eclipse | 提供数据库插件支持 |
| 依赖管理 | Maven/Gradle | 管理数据库驱动依赖 |
示例:Maven依赖配置(MySQL)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
数据库安装与配置
安装数据库系统
- MySQL:官网下载社区版,通过
mysqld --initialize初始化数据目录,设置root密码。 - PostgreSQL:使用
brew install postgresql(macOS)或官网安装包,启动postgresql服务。 - SQLite:无需安装服务器,直接通过JDBC连接文件数据库(如
test.db)。
配置数据库连接参数
| 数据库类型 | JDBC URL格式 | 默认端口 |
|---|---|---|
| MySQL | jdbc:mysql://host:3306/database_name |
3306 |
| PostgreSQL | jdbc:postgresql://host:5432/database_name |
5432 |
| SQLite | jdbc:sqlite:/path/to/database/file |
|
| H2(内存数据库) | jdbc:h2:mem:testdb |
Java连接数据库的步骤
加载JDBC驱动
// 旧版本驱动需手动加载
Class.forName("com.mysql.cj.jdbc.Driver");
// 新版本驱动可省略(自动注册)
建立数据库连接
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password);
创建数据库与表
// 创建数据库(MySQL需先选数据库)
Statement stmt = conn.createStatement();
stmt.execute("CREATE DATABASE IF NOT EXISTS mydb");
stmt.execute("USE mydb");
// 创建表
String createTable = "CREATE TABLE users (" +
"id INT PRIMARY KEY AUTO_INCREMENT," +
"name VARCHAR(50)," +
"email VARCHAR(100)" +
")";
stmt.execute(createTable);
CRUD操作与安全实践
插入数据(PreparedStatement防注入)
String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "Alice"); pstmt.setString(2, "alice@example.com"); pstmt.executeUpdate();
查询数据
ResultSet rs = stmt.executeQuery("SELECT FROM users");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + ": " + name);
}
更新与删除
// 更新 String updateSql = "UPDATE users SET email = ? WHERE name = ?"; PreparedStatement updateStmt = conn.prepareStatement(updateSql); updateStmt.setString(1, "new_email@example.com"); updateStmt.setString(2, "Alice"); updateStmt.executeUpdate(); // 删除 String deleteSql = "DELETE FROM users WHERE id = ?"; PreparedStatement deleteStmt = conn.prepareStatement(deleteSql); deleteStmt.setInt(1, 1); deleteStmt.executeUpdate();
最佳实践
-
资源管理
使用try-with-resources自动关闭连接与语句:try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 执行操作 } catch (SQLException e) { e.printStackTrace(); } -
连接池优化
使用HikariCP提高性能:HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection();
-
异常处理
捕获SQLException并记录日志,避免程序崩溃。
FAQs
Q1:如何解决ClassNotFoundException: com.mysql.cj.jdbc.Driver?
A1:确保已添加对应数据库的JDBC驱动依赖(如Maven中的mysql-connector-java),且驱动版本与Java版本兼容,MySQL 8.x驱动需搭配Java 8+。
Q2:如何防止SQL注入攻击?
A2:始终使用PreparedStatement代替Statement,避免直接拼接用户输入到SQL语句中。
// 错误方式(存在注入风险)
String unsafeSql = "SELECT FROM users WHERE name = '" + userInput + "'";
// 正确方式
PreparedStatement pstmt = conn.prepareStatement("SELECT FROM users WHERE name = ?");
pstmt.setString(1, user
