阅读文本大概需要 6 分钟。
之前的文章我们已经介绍了JDBC的基本使用《哥哥面前一条弯弯的河 --「JDBC」连接数据库》原生的JDBC实在是太繁琐了,今天我们就来解决这个问题,封装自己的 JdbcUtil工具类:
在Java开发中,使用JDBC操作数据库的主要有一下的四个步骤:
① 加载数据库驱动程序: Class.forName("数据库驱动类"); ② 连接数据库: Connection con = DriverManager.getConnection(); ③ 操作数据库: Statement stat = con.prepareStatement(sql); stat.executeQuery(); ④ 关闭数据库,释放连接: con.close();
也就是说,所有的用户都需要经过此四步进行操作,但是这四步之中有三步(加载数据库驱动程序、连接数据库、关闭数据库,释放连接) 对所有人都是一样的,只有在操作数据库方面是不一样,那么这就造成了性能的损耗。
所以我们可以抽取一个工具类,来实现共同的操作。 这就是 JDBCUtil 类,它需要拥有最基本的获取 Connection 连接,以及释放连接关闭数据库的功能:
public class JdbcUtil {
// 获取数据库连接
public static Connection getConnection(){ ... }
// 释放资源
public static void release(ResultSet rs,Statement stmt,Connection conn){...}
}
实现JDBCUtil
这两个方法倒是简单,用我们之前的方法就能实现。但是作为一个工具,我们还可以将 加载数据库驱动程序 的步骤,提前到静态代码块中来完成,在结合配置文件实现具体的数据库解耦:
配置文件 jdbc.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8
user=root
password=root
JDBCUtil 实现类:
public class JdbcUtil {
//1.创建数据库的4个字符串
private static String driverClass;
private static String url;
private static String user;
private static String password;
// 加载数据库驱动
static{
try {
//创建Properties对象 获取jdbc.properties对应的输入流
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties props = new Properties();
props.load(in);
//具体决定4个字符串的值
driverClass = props.getProperty("driverClass");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
//加载数据库驱动程序
Class.forName(driverClass);
} catch (Exception e) {
//初始化异常
throw new ExceptionInInitializerError(e);
}
}
// 获取数据库连接
public static Connection getConnection() throws Exception {
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
// 释放资源
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
测试类(TestUtils)
public class TestUtils {
public static void main(String[] args) throws SQLException {
// 得到一个Connection
Connection conn = JdbcUtil.getConnection();
// 得到一个执行sql语句Statement
Statement stmt = conn.createStatement();
String sql = "select id,username from info";
// 执行sql得到结果集
ResultSet rs = stmt.executeQuery(sql);
// 遍历结果集
while(rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
System.out.println(id + " : " + username);
}
// 释放资源
JdbcUtil.release(rs,stmt,conn);
}
}
现在有了 JDBCUtil 我们操作数据库,在使用工具类实现 CRUD 操作,就不需要考虑繁琐的加载驱动、获取连接 以及关闭数据库 释放资源 异常处理等操作了。
但是,JDBC 工具的优化与重构之路,还远远没有结束,你可以关注我们的公众号,下一期我们将继续介绍 数据库连接池 的原理与使用。