关于Class.forName("com.mysql.jdbc.Driver");
如果只导入:
import com.mysql.jdbc.Driver;
不DriverManager.registerDriver(new Driver());
与
Class.forName("com.mysql.jdbc.Driver");
有什么区别?
------解决方案--------------------Class.forName("com.mysql.jdbc.Driver");传的是字符串,其可配置性更强.可通过配置文件直接配置数据库驱动.其运行结果与DriverManager.registerDriver(new Driver());是一样的.因为Driver类加载时虚拟机会执行其类定义的static方法块,方法块内调用了DriverManager.registerDriver(new Driver());
而DriverManager.registerDriver(new Driver());则是存手工编码,后期修改数据库的工作量是需要手动更改代码,而不是想上面一样,通过修改配置文件中的数据库驱动的对象全路径的字符串就行.
所以Class.forName("com.mysql.jdbc.Driver");是教科书上推荐使用的方法.
------解决方案--------------------forName类似于找到那个类名并初始化,要是不想初始化可以通过增加参数去更改,具体看下api
给个例子你就明白了,
forName(“A”).new Instanct();//我应该拼错,你自己去开发环境下看看
等价于new A();
注意,有参数的构造函数就没有办法了,然后你的那个只是找到驱动,为什么就可以了呢,因为那个驱动器里面有个static块,他通过加载那个类然后调用静态块去注册这个驱动,因此,你导入那个类然后 new Driver();也是可以实现相同的效果的,多看源码才可以
------解决方案--------------------import只是给编译器看的,运行时jvm根本不知道有它;Class.forName()是加载类的代码,类中静态块中的代码被执行,加载了驱动
------解决方案--------------------是hibernate的配置文件,一般是hibernate.cfg.xml
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>