在Java项目中,使用Maven管理依赖并连接数据库是常见开发场景,以下是详细步骤及注意事项,涵盖依赖配置、数据库驱动加载、连接池使用及代码示例。
添加数据库依赖
首先在pom.xml
中添加数据库驱动和连接池依赖,以MySQL为例,常用依赖如下:
<!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- 连接池(如HikariCP) --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency>
不同数据库的驱动选择:
| 数据库 |groupId|artifactId|示例版本|
|————–|——-|———-|——–|
|MySQL 5.x |mysql |mysql-connector-java|5.1.49|
|MySQL 8.x |mysql |mysql-connector-java|8.0.28|
|PostgreSQL |org.postgresql|postgresql|42.3.3|
|Oracle |com.oracle.database.jdbc|ojdbc8|19.3.0.0|
|SQL Server |com.microsoft.sqlserver|mssql-jdbc|9.4.0.jre11|
配置数据库连接参数
在src/main/resources
目录下创建application.properties
或config.properties
文件,存储连接信息:
# 数据库基础配置 db.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC db.username=root db.password=your_password db.driver=com.mysql.cj.jdbc.Driver # 连接池配置(HikariCP示例) db.pool.maximum-pool-size=10 db.pool.minimum-idle=5 db.pool.connection-timeout=30000 db.pool.idle-timeout=600000 db.pool.max-lifetime=1800000
参数说明:
db.url
:包含协议、主机、端口、数据库名及连接参数(如时区设置)。useSSL
:开发环境可禁用SSL以避免警告。serverTimezone
:避免时区不匹配报错。
编写数据库连接工具类
通过连接池管理数据库连接,避免频繁创建销毁连接,以下是使用HikariCP的示例代码:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.SQLException; public class DBUtil { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC"); config.setUsername("root"); config.setPassword("your_password"); config.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 连接池优化配置 config.setMaximumPoolSize(10); config.setMinimumIdle(5); config.setConnectionTimeout(30000); config.setIdleTimeout(600000); config.setMaxLifetime(1800000); dataSource = new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } public static void closeConnection(Connection conn) { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
关键点:
- 使用静态代码块初始化连接池,确保单例模式。
- 通过
getConnection()
获取连接,使用后需手动关闭(或尝试-with-resources语法)。
数据库操作示例
以下为查询和更新数据的完整示例:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDao { public void getUserById(int id) { String sql = "SELECT * FROM users WHERE id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, id); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println("Username: " + rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); } } public void updateUser(int id, String newEmail) { String sql = "UPDATE users SET email = ? WHERE id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, newEmail); pstmt.setInt(2, id); int affectedRows = pstmt.executeUpdate(); System.out.println("Updated rows: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } } }
注意事项:
- 预编译语句(PreparedStatement):防止SQL注入,提高性能。
- 资源释放:使用try-with-resources自动关闭
Connection
、PreparedStatement
和ResultSet
。 - 事务管理:需手动提交或回滚事务(默认为自动提交)。
常见问题排查
- 驱动加载失败:检查
pom.xml
中依赖是否正确下载,driverClassName
是否与驱动版本匹配。 - 连接超时:确认数据库服务是否启动,网络是否可达,检查连接池超时参数。
- 时区错误:在URL中添加
serverTimezone=UTC
或指定本地时区(如Asia/Shanghai
)。
相关问答FAQs
Q1: Maven下载依赖时提示“下载失败”怎么办?
A: 可能原因包括网络问题、仓库配置错误或依赖版本不存在,解决方法:
- 检查网络连接,尝试更换镜像源(如阿里云镜像)。
- 在
pom.xml
中添加阿里云仓库配置:<repositories> <repository> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> </repository> </repositories>
- 验证依赖版本号是否正确,可通过Maven中央仓库查询。
Q2: 数据库连接泄露如何避免?
A: 连接泄露未关闭会导致连接池耗尽,解决方法:
- 始终使用try-with-resources语法确保资源释放:
try (Connection conn = DBUtil.getConnection(); Statement stmt = conn.createStatement()) { // 执行SQL } // 自动关闭
- 监控连接池状态,通过HikariCP的
MBean
或日志跟踪未释放连接。 - 避免在代码中缓存
Connection
对象,每次使用后立即释放。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复