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