JDBC连接数据库中为什么forName()方法没有调用newInstance()方法

1 篇文章 0 订阅
1 篇文章 0 订阅

常规连接数据库

通过原生的jdbc代码进行数据库操作咱们以mysql数据库为例,分为以下7步:

1.定义连接数据库的驱动全类名driverName

2.定义连接数据的url

3.定义用户名user与密码password

4.通过Class.forName(driverName)加载驱动类

5.通过DriverManager.getConnection(url,user,password)获取数据库连接

6.编写sql通过PreparedStatement 或者Statement进行数据库crud操作

7.关闭连接;

代码如下所示:

    //低版本为com.mysql.jdbc.Driver
    public  static final String driverName="com.mysql.cj.jdbc.Driver";//高版本8.0.13
    public  static final String url="jdbc:mysql://localhost:3306/yourDb";
    public  static final String user="root";
    public  static final String password="1234";

    public static void main(String[] args) throws Exception {
        Class.forName(driverName);
        Connection conn=DriverManager.getConnection(url,user,password);
        if(conn!=null){
            System.out.println("========获取连接成功========");
            //执行数据库操作
            //关闭连接
        }else{
            System.out.println("========获取连接失败========");
        }

我们刚开始学的时候,根据书上一步一步来;发现定义好driverName、url、user、password、之后再调用

Class.forName(driverName);

DriverManager.getConnection(url,user,password);

这两步操作之后就成功的获取到了数据库连接;然后照葫芦画瓢进行一些列操作。但是当我们学习了类的动态加载与创建对象的时候不免心中就有了疑惑:

1.只有Class.forName()方法,而没有调用.newInstance()方法

2.DriverManager跟加载之后的dirver有什么关系(我们的操作中没有定义这俩的关系)

Class clazz=Class.forName(driverName)按照我们提供的全类名加载该类到jvm中,然后通过clazz.newInstance()方法再强转会动态的得到该类的一个对象,有了对象之后我们才可以通过对象进行后续的一系列操作;

而我们通过jdbc连接数据库的时候只有Class.forName()就结束了,没有.newInstance();紧接着后面的代码交给DriverManager个人秀:DriverManager.getConnection(url,user,password);

代码跟踪到mysql-connect-java源码中的com.mysql.cj.jdbc.Driver类如下图(一个放不下,分开截取两个)所示:

 

Driver类中的代码如下所示:

看到这一块终于明白了,当一个类被成功加载后,该类中的静态代码快也一定被执行了。所以我们通过Class.forName(driverName)方法成功加载了Driver类,同理该类中的静态代码快也执行完成了。

Driver类中静态代码快中干了两件事:1.创建自己的一个对象,由于已经new Driver()了所以后续我们不再需要调用.newInstance()方法了。2.把自己注册到DriverManager中就完事了;难怪接下来都是DriverManager的个人秀了;我们可以直接把这句代码DriverManager.registerDriver(new Driver())拿出来替换掉Class.forName(driverName);

修改后的代码如下所示:

结果如下图所示:

连接oracle数据库跟踪

同样的方式我们来查看连接oracle数据库的驱动中的代码,如下图所示:

可以得出oracle与mysql一致,都是在驱动类中向DriverManager中注册驱动,至于sqlserver等其他的驱动就不一一列举了,有兴趣的自己下去跟踪一下。

 

ok~完事大吉!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值