文章目录
一、JDBC 1.0:手动管理的起点
1.1 核心特点
手动加载驱动:通过Class.forName()或DriverManager.registerDriver()显式注册驱动。
硬编码连接信息:数据库URL、用户名、密码直接写在代码中。
资源手动关闭:需逐一手动关闭Connection、Statement、ResultSet。
1.2 代码示例:
public class JdbcUtils {
// 硬编码数据库信息
public static Connection getConnection() {
Connection conn = null;
try {
DriverManager.registerDriver(new Driver()); // 加载驱动
conn = DriverManager.getConnection("jdbc:mysql:///spring_db", "root", "1234");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 手动关闭资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try { rs.close(); } catch (Exception e) { e.printStackTrace(); }
try { stmt.close(); } catch (Exception e) { e.printStackTrace(); }
try { conn.close(); } catch (Exception e) { e.printStackTrace(); }
}
}
1.3 痛点分析
- 代码冗余:每次操作需重复编写连接和关闭逻辑。
- 维护困难:修改数据库配置需改动源码。
- 性能低下:频繁创建和销毁连接消耗资源。
二、JDBC 2.0:配置化的升级
2.1 核心改进
- 配置文件分离:使用db.properties存储数据库配置。
- 动态加载配置:通过Properties类读取配置文件,实现解耦。
- 统一资源管理:封装工具类减少重复代码。
2.2 代码示例
# db.properties
driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=1234
public class JdbcUtils2 {
private static String driverclass;
private static String url;
private static String username;
private static String password;
static {
// 加载配置文件
Properties pro = new Properties();
try (InputStream in = JdbcUtils2.class.getResourceAsStream("/db.properties")) {
pro.load(in);
driverclass = pro.getProperty("driverclass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
// 动态加载驱动并获取连接
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driverclass); // 反射加载驱动
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
2.3 优势与不足
优势:
- 配置与代码分离,便于维护。
- 减少硬编码,提升灵活性。
不足:
- 仍依赖DriverManager,无法解决频繁创建连接的性能问题。
三、JDBC 3.0:连接池的革命
3.1 核心改进
- 连接池管理:使用Druid等连接池,预先创建连接,随用随取。
- 性能飞跃:连接复用减少创建开销,支持并发和高负载。
- 自动化资源管理:通过DataSource接口隐藏底层细节。
3.2 代码示例
# druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=1234
initialSize=5
maxActive=20
maxWait=3000
public class JdbcUtils3 {
private static DataSource dataSource;
static {
try {
// 加载配置文件并初始化连接池
Properties props = new Properties();
props.load(JdbcUtils3.class.getResourceAsStream("/druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(props);
} catch (Exception e) {
throw new RuntimeException("连接池初始化失败", e);
}
}
// 从连接池获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 归还连接(实际是关闭资源)
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try { rs.close(); } catch (Exception ignored) {}
try { stmt.close(); } catch (Exception ignored) {}
try { conn.close(); } catch (Exception ignored) {}
}
}
3.3 核心优势
- 性能提升:连接复用减少70%的创建时间。
- 资源可控:限制最大连接数,防止数据库过载。
- 功能扩展:支持监控、SQL日志等高级功能。
四、版本对比与演进意义
特性 | JDBC 1.0 | JDBC 2.0 | JDBC 3.0 |
---|---|---|---|
配置管理 | 硬编码 | 配置文件 | 配置文件 + 连接池参数 |
连接获取 | 手动创建 | 动态加载 | 连接池自动分配 |
性能 | 低(频繁创建连接) | 中 | 高(连接复用) |
维护成本 | 高(修改需重新编译) | 低(修改配置文件) | 低(配置 + 监控) |
适用场景 | 简单Demo | 中小型项目 | 高并发、生产环境 |
五、实战:从1.0到3.0的查询示例
5.1 JDBC 1.0版本
public class JdbcDemo1 {
public static void main(String[] args) {
Connection conn = JdbcUtils.getConnection();
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM account");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.close(conn, stmt, rs);
}
}
}
5.2 JDBC 3.0版本(优化后)
public class JdbcDemo3 {
public static void main(String[] args) {
try (
Connection conn = JdbcUtils3.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM account")
) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
六、总结
- JDBC 1.0:适合快速验证功能,但缺乏扩展性和维护性。
- JDBC 2.0:通过配置文件解耦,适合中小项目。
- JDBC 3.0:连接池大幅提升性能,是高并发场景的标配。
演进启示:技术的升级始终围绕解耦、性能和易用性展开。掌握每个版本的核心思想,才能在实际项目中灵活选择最优方案。