2020-12-28

关于DriverManager.getConnection()里的增强实现

今天无意中注释了Class.forName("dm.jdbc.driver.DmDriver"); 反射加载驱动程序的代码,结果程序还是能正常查询数据库数据进行返回,
有点颠覆了我之前写demo的时候会用到这个来测试,必须要写Class.forName("dm.jdbc.driver.DmDriver");才能正常的访问数据,
我的测试代码如下:(我用的是达梦数据库测试的)

package org.example;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * @Description TODO * @Author Harry * @Date 2020/12/25 14:28 **/public class TestDmJdbc { public static void main(String[] args) {  Connection con = null;// 创建一个数据库连接  PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement  ResultSet result = null;// 创建一个结果集对象  try  {//   Class.forName("dm.jdbc.driver.DmDriver");// 加载驱动程序   System.out.println("开始尝试连接数据库!");   String url = "jdbc:dm://localhost:5236/GEN?useUnicode=true&characterEncoding=UTF-8";// 127.0.0.1是本机地址   String user = "GEN";// 用户名,系统默认的账户名   String password = "123456789";// 你安装时选设置的密码   con = DriverManager.getConnection(url, user, password);// 获取连接   System.out.println("连接成功!");   String sql = "select * from gen_test1";// 预编译语句,"?"代表参数   pre = con.prepareStatement(sql);// 实例化预编译语句   //pre.setString(1, "303");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引   result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数   while (result.next())    // 当结果集不为空时    System.out.println("学号:" + result.getInt("id") + "姓名:"      + result.getString("testName"));  }  catch (Exception e)  {   e.printStackTrace();  }  finally  {   try   {    // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源    // 注意关闭的顺序,最后使用的最先关闭    if (result != null)     result.close();    if (pre != null)     pre.close();    if (con != null)     con.close();    System.out.println("数据库连接已关闭!");   }   catch (Exception e)   {    e.printStackTrace();   }  } }}

于是出于好奇心去查了一下源码,翻的过程中在DriverManager类上发现了一段这样的注释
file
同时看到如下加载源码

原来实现驱动的第三方厂商只要按java SPI支持,就会自动注册进驱动,所以我看到源码里实现的方式也是用list存放所有的驱动
file
这个是不同厂商的实现
file
以此解了我心中的疑惑!

本文由博客群发一文多发等运营工具平台 OpenWrite 发布









原文转载:http://www.shaoqun.com/a/504257.html

跨境电商:https://www.ikjzd.com/

insider:https://www.ikjzd.com/w/1786

捷汇:https://www.ikjzd.com/w/419


今天无意中注释了Class.forName("dm.jdbc.driver.DmDriver");反射加载驱动程序的代码,结果程序还是能正常查询数据库数据进行返回,有点颠覆了我之前写demo的时候会用到这个来测试,必须要写Class.forName("dm.jdbc.driver.DmDriver");才能正常的访问数据,我的测试代码如下:(我用的是达梦数据
tracker:tracker
马士基集团:马士基集团
口述:我出轨后 老公说更爱我了:口述:我出轨后 老公说更爱我了
春节陆丰汽车总站到巽寮湾自驾游怎走?远吗?:春节陆丰汽车总站到巽寮湾自驾游怎走?远吗?
顺德碧桂园里面有什么特色美食?:顺德碧桂园里面有什么特色美食?

No comments:

Post a Comment