jdbc加载驱动 Class.forName()的作用

在学习jdbc时,我们首先学到的是最简单的helloWorld入门,但是为什么要这样呢 ?

  1. //注册驱动

  2. Class.forName("com.mysql.jdbc.Driver");

  3. String url = "jdbc:mysql:///zfx?characterEncoding=UTF-8";

  4. //获取连接

  5. Connection conn = DriverManager.getConnection(url, "root", "root");

  6. //数据库操作对象

  7. Statement statement = conn.createStatement();

  8. //执行sql

  9. ResultSet resultSet = statement.executeQuery("select * from student");

  10. while(resultSet.next()){

  11. String name = resultSet.getString("name");

Java.sql.Driver

Java.sql.Connection

Java.sql.Statement

Java.sql.ReslutSet 

java连接数据库最重要的就是这四个类,所有数据库厂商,如果要用java连接数据库必须实现这四个类

如上图所示,大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。

  1. com.mysql.jdbc.Driver driver = null;

  2. //or:

  3. ClassLoader cl = new ClassLoader();

  4. cl.loadClass("com.mysql.jdbc.Driver");

其实我们只要看一下mysql 实现 Java.sql.Driver这个接口时,初始化做的工作就一目了然了

  1. package com.mysql.jdbc;

  2.  
  3. import java.sql.DriverManager;

  4. import java.sql.SQLException;

  5.  
  6. public class Driver extends NonRegisteringDriver

  7. implements java.sql.Driver

  8. {

  9. public Driver()

  10. throws SQLException

  11. {

  12. }

  13.  
  14. static

  15. {

  16. try

  17. {

  18. DriverManager.registerDriver(new Driver());

  19. } catch (SQLException E) {

  20. throw new RuntimeException("Can't register driver!");

  21. }

  22. }

  23. }

所以我们完全可以将  

Class.forName("com.mysql.jdbc.Driver");

换成

 DriverManager.registerDriver(new Driver());


但是并不建议这么做,因为 第一种的好处是:Class.forName依赖的是字符串,而不是具体类,所以,可以通过配置文件修改连接哪一个数据库。

是不是明白了 ? 就是在静态代码块里向驱动管理器DriverManager注册了驱动,就是这么简单喽

java中class.forName()和classLoader都可用来对类进行加载。
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块

Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象

猜你喜欢

转载自blog.csdn.net/qq_29663071/article/details/81329511
今日推荐