文章目录
-
- 1、简述
- 2、什么是 Driver
-
- 2.1、Driver 接口源码
-
- 2.1.1、Connection connect(String url, java.util.Properties info)
- 2.1.2、 boolean acceptsURL(String url)
- 2.1.3、DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)
- 2.1.4、int getMajorVersion()
- 2.1.5、int getMinorVersion()
- 2.1.6、boolean jdbcCompliant()
- 2.1.7、Logger getParentLogger()
- 3、Class.forName() 手动加载驱动
- 4、DriverManager 源码分析
1、简述
DriverManager 是用于管理JDBC驱动程序的基础服务。DriverManger 可以注册、删除、加载的驱动程序,可以根据给定的url获取符合url协议的驱动Driver 并建立Conenction连接,进行数据库交互。当DriverManager被使用时,DriverManager类将尝试加载“ jdbc.drivers”系统属性中的驱动程序类。
JDBC 4.0驱动程序必须包含文件 META-INF/services/java.sql.Driver,该文件包含了实现java.sql.Driver的JDBC驱动程序的名称。例如,要加载my.sql.Driver类,META-INF/services/java.sql.Driver文件中将包含以下内容:my.sql.Driver。
使用DriverManager之后,应用程序不再需要使用 Class.forName() 显式加载JDBC驱动程序了。已经使用 Class.forName() 显式加载JDBC驱动的程序也不会受到影响,也无需刻意去修改。
当调用方法getConnection时,DriverManager将尝试从初始化时加载的驱动程序和当前应用程序显式加载的驱动程序中找到合适的驱动程序。
2、什么是 Driver
Driver 就是驱动程序,当我们的应用程序需要连接 mysql、oracle 等数据库时,需要一个相应的驱动程序来实现搭桥牵线才行。
一般不同的厂商都会提供相应的数据库驱动程序,来方便应用程序的连接。那么怎么加载不同厂商的数据库驱动呢,有没有一个统一的标准规范呢?答案是有的,那就是 java.sql.Driver 接口,也就是说实现了该接口的类就是驱动类(Driver)。比如MySQL:com.mysql.cj.jdbc.Driver。
2.1、Driver 接口源码
DriverManager将尝试加载尽可能多的驱动程序,然后针对任何给定的连接请求,依次要求每个驱动程序尝试连接到目标URL。
2.1.1、Connection connect(String url, java.util.Properties info)
/**
* 尝试建立给定URL的数据库连接。 如果驱动程序意识到连接到给定URL的驱动程序类型错误,则应返回“ null”。 这是很常见的,因为当要求JDBC驱动程序管理器连接到给定的URL时,它将URL依次传递给每个已加载的驱动程序。
*
*如果驱动程序是连接到给定URL的正确驱动程序,但在连接数据库时遇到问题,则应引发SQLException。
*
注意:如果将属性指定为url的一部分,并且也在Properties对象中指定了属性,则该实现将由实现定义,以哪个值优先。 为了获得最大的可移植性,应用程序应仅指定一次属性。
*
* @param url 连接到指定url的数据库地址
* @param 键值对格式的连接参数,通常会包含用户名和密码
* @return 与URL的连接的Connection对象
*/
Connection connect(String url, java.util.Properties info)
throws SQLException;
2.1.2、 boolean acceptsURL(String url)
/**
* 检索驱动程序是可以打开与给定URL的连接。 通常,如果驱动程序识别出 URL中指定的子协议,则将返回true;否则,将返回false。
*
* @param 数据库的URL
* @return 如果此驱动程序可以理解给定的URL,则为true;否则为false。 否则为假
* @exception 如果发生数据库访问错误或url为null,将抛出 SQLException
*/
boolean acceptsURL(String url) throws SQLException;
2.1.3、DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)
/**
* 获取有关此驱动程序可能的属性的信息。
*
getPropertyInfo方法旨在允许通用的GUI工具发现应该提示的属性,以便获得足够的信息以连接到数据库。
*
* @param u要连接的数据库的URL
* @param 连接打开时需要的参数
* @return 描述属性的DriverPropertyInfo对象的数组。
*/
DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)
throws SQLException;
2.1.4、int getMajorVersion()
/**
* 获取驱动程序的主版本号。 最初应为1。
*
*/
int getMajorVersion();