使用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了。