• 关于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 发布

  • 相关阅读:
    thinkphp5分页
    thinkphp 获取器、修改器
    Thinkphp中对数据库的基础操作
    MYSQL 数据库内容的分页展示
    单例模式连接数据库
    简单的通过ajax ‘POST’ 方法实现与后台数据交互
    PHP中 .= 的意思
    mysqli 简单的php注册登录功能
    4.4
    梦断代码阅读笔记1
  • 原文地址:https://www.cnblogs.com/harryzhang66/p/14202556.html
Copyright © 2020-2023  润新知