JDBC中链接数据库前为什么要用Class.forName(驱动类)加载驱动类?

使用JDBC链接数据库时,为什么要先使用Class.forName(String name)来加载类?

 

答:

实际上就是为了加载类时,调用静态初始化块中的注册函数。

可以看一下MySql的Driber类源码

1.    class Driver extends NonRegisteringDriver implements java.sql.Driver {  
2.        // ~ Static fields/initializers  
3.        // ---------------------------------------------  
4.      
5.        //  
6.        // Register ourselves with the DriverManager  
7.        //  
8.        static {  
9.            try {  
10.                java.sql.DriverManager.registerDriver(new Driver());  
11.            } catch (SQLException E) {  
12.                throw new RuntimeException("Can't register driver!");  
13.            }  
14.        }  
15.      
16.        // ~ Constructors  
17.        // -----------------------------------------------------------  
18.      
19.        /** 
20.         * Construct a new driver and register it with DriverManager 
21.         *  
22.         * @throws SQLException 
23.         *             if a database error occurs. 
24.         */  
25.        public Driver() throws SQLException {  
26.            // Required for Class.forName().newInstance()  
27.        }  
28.    }  

 

可以看到在第10行代码,也就是静态初始化块中,的代码是用于注册驱动的。

所以用Class.forName实际上就是为了调用这个注册驱动的方法。

当然我们也可以直接调用DriverManager类中的registerDriver(new com.mysql.jdbc.Driver())来进行驱动的注册,这样就不用Class.forName了。

posted @ 2018-01-05 08:35  青儿哥哥  阅读(4302)  评论(3编辑  收藏  举报