一、引言
在 Java 开发中,与数据库的交互是一项常见且重要的任务。JDBC(Java Database Connectivity)作为 Java 语言访问数据库的标准 API,为我们提供了统一的接口来操作各种数据库。然而,每次进行数据库操作都编写大量重复的代码,如加载驱动、获取连接、释放资源等,不仅繁琐,还容易出错。因此,我们通常会封装一个 JDBC 工具类来简化这些操作。本文将详细介绍我所编写的三个不同版本的 JDBC 工具类,分别是基础版(1.0)、优化版(2.0)和连接池版(3.0)。
二、基础版(1.0):JDBCUtilsO
2.1 代码实现
package com.qcby;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCUtilsO {
/**
* 加载驱动的方法 static
*/
public static void loadDriver() {
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}catch(Exception e){
e.printStackTrace();
}
}
//获取链接
public static Connection getconnect() {
loadDriver();
Connection conn = null;
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if(rs != null) {
try{
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stmt != null) {
try{
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null) {
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.2 代码分析
- 加载驱动:通过
Class.forName("com.mysql.cj.jdbc.Driver")
加载 MySQL 的 JDBC 驱动。 - 获取连接:使用
DriverManager.getConnection
方法获取数据库连接,需要硬编码数据库的 URL、用户名和密码。 - 释放资源:依次关闭
ResultSet
、Statement
和Connection
对象,确保资源被正确释放。
2.3 优缺点
- 优点:代码简单易懂,适合初学者理解 JDBC 的基本操作流程。
- 缺点:
- 数据库连接信息硬编码在代码中,不利于维护和修改。
- 每次获取连接都需要重新加载驱动,效率较低。
三、优化版(2.0):JdbcUtils
3.1 代码实现
package com.qcby;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static final String driverclass;
private static final String url;
private static final String username;
private static final String password;
static {
//加载属性文件
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
if (in == null) {
System.out.println("找不到配置文件");
}
try{
prop.load(in);
} catch (Exception e) {
e.printStackTrace();
}
//给常量赋值
driverclass = prop.getProperty("driverclass");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
}
/**
* 加载驱动
*/
public static void loadDriver() throws ClassNotFoundException, SQLException {
try{
//加载驱动类
Class.forName(driverclass);
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
}
/**
* 获取链接 返回链接对象
* @return
*/
public static Connection getConnection() {
//加载驱动
//获取到链接对象,返回连接对象;
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (stmt != null) {
try{
stmt.close();
}
catch (Exception e){
e.printStackTrace();
}
}
if (conn != null) {
try{
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3.2 代码分析
- 配置文件加载:通过
Properties
类加载jdbc.properties
配置文件,将数据库连接信息存储在配置文件中,避免了硬编码。 - 静态代码块:在类加载时执行静态代码块,确保驱动只加载一次。
- 获取连接:从配置文件中读取数据库连接信息,使用
DriverManager.getConnection
方法获取连接。
3.3 优缺点
- 优点:
- 数据库连接信息存储在配置文件中,便于维护和修改。
- 驱动只加载一次,提高了效率。
- 缺点:每次获取连接都需要创建新的连接对象,频繁创建和销毁连接会消耗大量的系统资源。
四、连接池版(3.0):JDBCUtilsC
4.1 代码实现
package com.qcby;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtilsC {
//连接池对象
private static DataSource DATA_SOURCE;
static {
//加载属性文件
Properties prop = new Properties();
InputStream input = JDBCUtilsC.class.getClassLoader().getResourceAsStream("jdbc.properties");
try{
//加载属性文件
prop.load(input);
//创建连接池对象
DATA_SOURCE = DruidDataSourceFactory.createDataSource(prop);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 从连接池中获取链接,返回
*/
public static Connection getConnection() {
Connection conn = null;
try{
conn = DATA_SOURCE.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn, Statement stmt, ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4.2 代码分析
- 连接池的使用:使用阿里巴巴的 Druid 连接池,通过
DruidDataSourceFactory.createDataSource
方法创建连接池对象。 - 获取连接:从连接池中获取连接,而不是每次都创建新的连接对象。
- 释放资源:关闭连接时,实际上是将连接归还给连接池,而不是真正的关闭。
4.3 优缺点
- 优点:
- 连接池可以复用连接对象,减少了频繁创建和销毁连接的开销,提高了系统的性能。
- 连接池可以对连接进行管理,如连接的超时、最大连接数等,提高了系统的稳定性。
- 缺点:引入了第三方依赖,增加了项目的复杂度。
五、总结
通过对三个不同版本的 JDBC 工具类的介绍,我们可以看到,随着版本的升级,工具类的性能和可维护性都得到了显著的提升。基础版适合初学者了解 JDBC 的基本操作,优化版通过配置文件和静态代码块提高了代码的可维护性和效率,而连接池版则通过连接池的使用进一步提高了系统的性能和稳定性。在实际开发中,我们应该根据项目的需求选择合适的版本。
希望本文对你理解 JDBC 工具类的优化过程有所帮助。如果你有任何问题或建议,欢迎在评论区留言。
以上博客围绕 JDBC 工具类的三个版本展开,从基础版逐步优化到连接池版,详细介绍了每个版本的代码实现、代码分析和优缺点,希望能满足你的需求。你可以根据实际情况进行调整和修改。