时间:2021-07-01 10:21:17 帮助过:31人阅读
* <P>应用程序不再需要使用<code> Class.forName()</ code>显式加载JDBC驱动程序。 现有程序
* 当前使用<code> Class.forName()</ code>加载JDBC驱动程序将继续工作而无需
* 修改。
原来在新版本的JDBC中不用在通过Class.forName()来显示加载JDBC驱动,那到底是怎么实现的呢,我们来看下源码。
下面是引入的mysql-connector-java包
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.11</version>
- </dependency>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> insertData() {
- </span><span style="color: #0000ff;">private</span> String URL = "jdbc:mysql://localhost:port/databaseName?useUnicode=true&characterEncoding=UTF-8"<span style="color: #000000;">;
- </span><span style="color: #0000ff;">private</span> String USER = "xx"<span style="color: #000000;">;
- </span><span style="color: #0000ff;">private</span> String PASSWORD = "xx"<span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">1 加载数据库驱动</span>
- Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); <span style="color: #008000;">//</span><span style="color: #008000;"> 2 获取链接connection</span>
- PreparedStatement preparedStatement = connection.prepareStatement("insert into test (name, sex) values (?,?)"); <span style="color: #008000;">//</span><span style="color: #008000;"> 3 通过statement对象执行sql</span>
- preparedStatement.setString(1, "xx"<span style="color: #000000;">);
- preparedStatement.setString(</span>2, "yy"<span style="color: #000000;">);
- Boolean result </span>= preparedStatement.execute(); <span style="color: #008000;">//</span><span style="color: #008000;"> 4 获取返回结果</span>
- }
启动服务后,执行静态方法DriverManager.getConnection 因为需要加载DriverManager类,所以执行static静态代码块。
在java这头定义了一个Driver接口,ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class),那么ServiceLoader.load()方法是干什么的呢?
在ServiceLoader.load时,根据传入的接口类,遍历META-INF/services
目录下的以该类命名的文件中的所有类,并实例化返回。ServiceLoader是spi机制的一个实现
具体可以参加ServiceLoader类的源代码如下图,PREIX是META-INF/services,service.getName是接口Driver的类名称,拼接出文件路径:
拼出的全路径fullName是:META-INF/services/java.sql.Driver,然后去本地找到该路径下的这个文件,然后把这个文件加载进来,这个文件的内容如下
文件内容是:com.mysql.cj.jdbc.Driver,这个类就是mysql厂商提供的驱动里面的Driver实现类,然后对其进行初始化加载,进行实例化,调这个类的static静态块,执行注册驱动。
ServiceLoader是SPI的是一种实现,SPI,全称Service Provider Interface,用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件。 通过jar包来实现扩展功能的热插拔。
JDBC自动加载驱动的SPI机制
标签:注册 ace 文件的 out 加载 load() 实例化 通过 遍历