今天没有什么太多的感悟,分享下jdbc的基础知识吧!欢迎大家留言评论!
JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。有了JDBC,程序员只需用JDBC API写一个程序,就可访问所有数据库。
JDBC有几个关键的类和接口:
DriverManager类:驱动的管理类,可以注册驱动、注销驱动、查看驱动列表等。
Connection接口:Connection是给定数据库的连接(会话),在一个连接中sql语句会被执行和返回结果,主要包括事务管理、创建Statement等。
Statement接口:用于执行静态SQL语句并返回其产生的结果的对象。
PreparedStatement接口:Statement的子类,预编译sql语句对象接口。一个sql语句被预编译并且存储在PreparedStatement对象中,后续可以高效多次执行该语句。
下面详细的说下DriverManager类的驱动注册过程。
从DriverManager的源码可以看到,有个静态代码块
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}
loadInitialDrivers()方法用来加载驱动。
加载驱动的方式有:
- 读取System.property中key值为jdbc.drivers的指定驱动列表
- 通过spi的方式,加载路径META-INF/services/java.sql.Driver文件指定的驱动列表
private static void loadInitialDrivers() {
String drivers;
try {
drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
// 读取指定驱动列表
return System.getProperty("jdbc.drivers");
}
});
} catch (Exception ex) {
drivers = null;
}
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
// 读取META-INF/services/java.sql.Driver文件指定的驱动列表
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
Iterator<Driver> driversIterator = loadedDrivers.iterator();
try{
while(driversIterator.hasNext()) {
driversIterator.next();
}
} catch(Throwable t) {
// Do nothing
}
return null;
}
});
println("DriverManager.initialize: jdbc.drivers = " + drivers);
if (drivers == null || drivers.equals("")) {
return;
}
String[] driversList = drivers.split(":");
println("number of Drivers:" + driversList.length);
for (String aDriver : driversList) {
try {
println("DriverManager.Initialize: loading " + aDriver);
Class.forName(aDriver, true,
ClassLoader.getSystemClassLoader());
} catch (Exception ex) {
println("DriverManager.Initialize: load failed: " + ex);
}
}
}
还可以通过DriverManager.registerDriver()方法注册驱动。
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
下面看下mysql的驱动注册加载
mysql的驱动类com.mysql.cj.jdbc.Driver
静态代码块调用DriverManager.registerDriver()
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
同时在路径META-INF/services/java.sql.Driver下指定了驱动类
以上就是浅显的驱动加载注册的过程,欢迎大家评论指教。