---->六步实现java程序对数据库的操作
---->为了简化六步,出现JDBCUtils
---->为了提高并发访问效率,出现连接池Druid/c3p0,可以直接从连接池获得Connection, 并且这个时候对Connection的进行了装饰,返回的Connection自带连接池引用, close()方法自动归还连接到连接池,
----->由于连接池技术的出现,它本身也封装了创建连接的步骤,所有我们可以利用这一点,在JDBCUtils中加以利用,这样就有了 利用连接池,改写JDBCUtils类,使JDBCUtils更加强大;
---->为了简化对结果集ResultSet的数据封装,出现了DBUtils,它直接对Connection /或者DataSource 操作; DBUtils核心类QueryRunner,用于sql操作,ResultSetHandler(结果集处理器)用于对数据进行封装;
2.JDBCUtils
我们按照JDBC规定的操作数据库的流程,使用JDBC定义的接口去操作数据库,发现果然可以操作数据库,但是发现一个问题我们每一次CRUD操作都要按以上步骤去操作,有大量重复的代码,毕竟每一次CRUD操作除了 sql语句不一样,其他部分差别不大,这个时候我们不难会想到能不能将冗余代码抽取一下,这个 时候JDBCUtils应运而生,它封装了 :a.注册驱动----->b.创建连接 ---->h.释放资源 ,三个步骤:
//a.注册驱动
public static void loadDriver(File file) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
Properties prop = new Properties();
prop.load(new FileInputStream(file));
driveClassName = prop.getProperty("driveClassName");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
}
//b.创建连接
public static Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
return DriverManager.getConnection(url, user, password);
}
// 释放资源
public static void release(ResultSet rs, Statement stmt, Connection conn) {
// TODO Auto-generated method stub
//释放ResultSet
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
//释放Statement
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
}
//释放Connection
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
=========================以下个人总结=========================
JDBCUtils单纯是将JDBC规定的访问数据库操作的中重复的步骤进行了封装,增加了代码复用性,简化了编程;
=========================以下个人写的JDBCUtils类========================
package com.itheima.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
* 其实就是在把
* 1.注册驱动
* public static void loadDriver(File file)
* 2.创建连接
* public static Connection getConnection()
* 3.是放资源
* public static void release(ResultSet rs, Statement stmt, Connection conn)
* 进行了封装
*/
public class JDBCUtils {
static String driveClassName;
static String url;
static String user;
static String password;
// 注册驱动,使内存中有驱动可用,驱动就是JDBC代码与数据库之间的翻译官
public static void loadDriver(File file) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
Properties prop = new Properties();
prop.load(new FileInputStream(file));
driveClassName = prop.getProperty("driveClassName");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
}
// 创建连接,在创建连接时,传入url参数来确定使用哪个驱动(翻译官)
public static Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
return DriverManager.getConnection(url, user, password);
}
// 释放资源
public static void release(ResultSet rs, Statement stmt, Connection conn) {
// TODO Auto-generated method stub
//释放ResultSet
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
//释放Statement
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
}
//释放Connection
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
}