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