JDBC详解与实战指南
1. JDBC基础概念
JDBC(Java Database Connectivity)是Java提供的API,用于连接和操作关系型数据库。核心接口包括DriverManager
、Connection
、Statement
、PreparedStatement
、CallableStatement
、ResultSet
等。
-
DriverManager:用于加载数据库驱动,并管理与数据库的连接。典型用法:
Connection conn = DriverManager.getConnection(url, username, password);
参数:
url
:数据库连接的URL,格式如jdbc:mysql://localhost:3306/dbname
。username
:数据库用户名。password
:数据库密码。
-
Connection:表示与数据库的连接。支持事务管理:
conn.setAutoCommit(false); // 开启事务 conn.commit(); // 提交事务 conn.rollback(); // 回滚事务
方法:
setAutoCommit(boolean autoCommit)
:设置是否自动提交。commit()
:提交事务。rollback()
:回滚事务。
2. SQL语句执行
-
Statement:用于执行静态SQL语句,适合一次性执行:
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users");
方法:
executeQuery(String sql)
:执行查询语句,返回ResultSet
。executeUpdate(String sql)
:执行更新操作,返回受影响的行数。
-
PreparedStatement:预编译的SQL语句,适合多次执行,提高性能并防止SQL注入:
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); pstmt.setInt(1, 123); ResultSet rs = pstmt.executeQuery();
参数和方法:
setInt(int parameterIndex, int value)
:设置整数参数。setString(int parameterIndex, String value)
:设置字符串参数。
-
CallableStatement:用于调用存储过程:
CallableStatement cstmt = conn.prepareCall("{call getUser(?)}"); cstmt.setInt(1, 123); ResultSet rs = cstmt.executeQuery();
3. 结果集处理
- ResultSet:存储查询结果,支持逐行读取数据:
方法:while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); }
next()
:移动到下一行。getInt(String columnLabel)
:获取指定列的整数值。getString(String columnLabel)
:获取指定列的字符串值。
4. 批量操作
- 批处理:通过
addBatch()
和executeBatch()
实现批量操作:PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (name) VALUES (?)"); pstmt.setString(1, "John"); pstmt.addBatch(); pstmt.setString(1, "Jane"); pstmt.addBatch(); pstmt.executeBatch();
5. 元数据
-
DatabaseMetaData:获取数据库的结构信息:
DatabaseMetaData dbMetaData = conn.getMetaData(); ResultSet tables = dbMetaData.getTables(null, null, "%", new String[] {"TABLE"});
- 方法:
getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
:获取数据库中的表信息。
- 方法:
-
ResultSetMetaData:获取结果集的元数据信息:
ResultSetMetaData rsMetaData = rs.getMetaData(); int columnCount = rsMetaData.getColumnCount();
6. 异常处理与调试
- SQLException:JDBC操作中抛出的主要异常,包含丰富的错误信息:
try { // JDBC操作 } catch (SQLException e) { System.err.println("Error Code: " + e.getErrorCode()); System.err.println("SQL State: " + e.getSQLState()); e.printStackTrace(); }
- 方法:
getErrorCode()
:获取错误代码。getSQLState()
:获取SQL状态码。
- 方法:
7. JDBC性能优化
- 连接池:使用连接池管理数据库连接,减少创建和关闭连接的开销。
- C3P0(C3P0 是一个开源的 JDBC 数据库连接池库)、
- HikariCP(Spring Boot默认集成的数据库连接池是HikariCP)、
- Druid连接池(Druid是阿里巴巴开源的数据库连接池项目))
- PreparedStatement重用:在高频查询中重用
PreparedStatement
,避免多次编译SQL语句。 - 批处理:使用批处理减少数据库交互次数,提高性能。