java.net.HttpURLConnection
类实现,步骤如下:创建URL对象,打开连接,设置请求方法(如GET/POST),添加请求头,获取输入流读取响应数据,最后关闭连接,需注意异常处理和资源释放。在Java开发中,即使不使用Spring、Hibernate等框架,也能通过JDBC(Java Database Connectivity)直接访问数据库,以下是详细步骤和注意事项,帮助开发者理解底层原理并实现高效安全的数据库操作。
为什么不用框架?
- 轻量化需求:小型项目或性能敏感场景可减少依赖。
- 学习原理:掌握JDBC有助于理解ORM框架的底层机制。
- 避免依赖冲突:减少第三方库的版本兼容问题。
- 灵活控制:直接管理连接和SQL执行过程。
JDBC访问数据库的6个核心步骤
以MySQL为例,需先导入驱动包(如mysql-connector-java-8.0.30.jar
)。
加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver"); // 自动注册驱动
建立数据库连接
使用DriverManager
获取连接,需指定URL、用户名和密码:
String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 后续操作 }
创建Statement对象
try (Statement stmt = conn.createStatement()) { // 执行SQL }
执行SQL并处理结果
- 查询操作:
String sql = "SELECT id, name FROM users"; try (ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } }
- 更新操作:
String updateSql = "UPDATE users SET name='Bob' WHERE id=1"; int affectedRows = stmt.executeUpdate(updateSql); System.out.println("更新行数: " + affectedRows);
关闭资源(关键!)
使用try-with-resources自动关闭连接、Statement和ResultSet,避免资源泄漏:
try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { // 操作数据... } // 此处自动关闭资源
完整代码示例
import java.sql.*; public class JdbcDemo { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test_db"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); // 实际项目中应记录日志 } } }
关键注意事项
防止SQL注入
禁止拼接SQL!使用PreparedStatement
预处理参数:
String sql = "SELECT * FROM users WHERE email = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "user@example.com"); // 安全设置参数 ResultSet rs = pstmt.executeQuery(); }
性能优化
- 连接池管理:避免频繁创建连接,用
DataSource
替代DriverManager
(如HikariCP):HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); try (HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection()) { // 操作数据库 }
- 批处理:大量数据操作时使用
addBatch()
和executeBatch()
。
异常处理
捕获SQLException
并明确处理:
try { // 数据库操作 } catch (SQLException e) { System.err.println("错误代码: " + e.getErrorCode()); System.err.println("SQL状态: " + e.getSQLState()); }
事务控制
通过Connection手动管理事务:
conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多个SQL conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚 }
适用场景建议
- 适合:小型工具、原型验证、底层库开发。
- 不适合:大型企业应用(需框架提供事务管理、缓存等高级特性)。
引用说明
通过JDBC直接操作数据库,开发者能深入理解Java与数据库的交互本质,为后续学习ORM框架打下坚实基础,务必重视资源关闭与安全防护,确保代码健壮可靠。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38490.html