核心步骤:Java连接数据库
Java通过JDBC(Java Database Connectivity) 标准接口实现数据库操作,需以下步骤:
准备数据库驱动
- 下载JDBC驱动:根据数据库类型选择驱动(如MySQL用
mysql-connector-java
,Oracle用ojdbc
)。 - 添加依赖:
- Maven项目(在
pom.xml
中):<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 使用最新版本 --> </dependency>
- 手动导入:下载JAR文件,放入项目的
lib
目录并添加到构建路径。
- Maven项目(在
建立数据库连接
使用DriverManager
获取连接对象,需提供URL、用户名、密码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { private static final String URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC"; private static final String USER = "your_username"; private static final String PASSWORD = "your_password"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }
关键参数说明:
URL
格式:jdbc:数据库类型://主机:端口/数据库名?参数
例:MySQL需加时区参数serverTimezone=UTC
。- 安全提示:避免硬编码密码,使用环境变量或配置文件(见下文)。
执行SQL操作
通过Connection
创建Statement
或PreparedStatement
执行SQL:
try (Connection conn = DBConnection.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?")) { stmt.setInt(1, 1001); // 设置参数(防SQL注入) ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); // 实际项目中应记录日志 }
关闭资源
使用 try-with-resources 自动关闭连接、语句和结果集(Java 7+支持),避免资源泄漏:
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM products")) { // 操作数据... } // 自动调用rs.close()、stmt.close()、conn.close()
安全与优化实践
-
避免硬编码敏感信息
- 使用配置文件(如
config.properties
):db.url=jdbc:mysql://localhost:3306/mydb db.user=admin db.password=secret
- Java读取配置:
Properties props = new Properties(); props.load(new FileInputStream("config.properties")); String url = props.getProperty("db.url");
- 使用配置文件(如
-
防SQL注入
务必用PreparedStatement
替代Statement
,禁止拼接SQL字符串:// 错误示例(危险!) String sql = "SELECT * FROM users WHERE name='" + inputName + "'"; // 正确做法 PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name=?"); stmt.setString(1, inputName);
-
连接池管理
高并发场景使用连接池(如HikariCP、Tomcat JDBC Pool)提升性能:HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); config.setUsername("user"); config.setPassword("password"); try (HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection()) { // 操作数据库... }
常见问题解决
-
驱动加载失败:
检查JAR是否在类路径中,MySQL 8+驱动类名为com.mysql.cj.jdbc.Driver
(无需显式调用Class.forName()
)。 -
时区错误:
MySQL URL中添加?serverTimezone=UTC
。 -
连接超时:
检查数据库服务是否运行,防火墙是否开放端口(默认MySQL端口3306)。
完整示例代码
import java.sql.*; import java.util.Properties; public class DatabaseDemo { public static void main(String[] args) { // 从配置文件读取信息(安全推荐) Properties props = new Properties(); try { props.load(DatabaseDemo.class.getResourceAsStream("/config.properties")); String url = props.getProperty("db.url"); String user = props.getProperty("db.user"); String password = props.getProperty("db.password"); // 连接并查询 try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement stmt = conn.prepareStatement("SELECT email FROM users WHERE id=?")) { stmt.setInt(1, 1001); ResultSet rs = stmt.executeQuery(); if (rs.next()) { System.out.println("Email: " + rs.getString("email")); } } } catch (Exception e) { System.err.println("数据库错误: " + e.getMessage()); } } }
引用说明
- JDBC官方文档:Oracle JDBC指南
- MySQL Connector/J下载:MySQL官网
- 连接池推荐:HikariCP GitHub
- 安全实践参考:OWASP SQL注入防护
重要提示:生产环境务必使用连接池、加密敏感信息(如Vault工具)、限制数据库账号权限,本文内容遵循Java最新标准(Java 17+),适用于MySQL、PostgreSQL等主流数据库(需调整URL和驱动)。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/30997.html