在网上查了一下有关Class.forName(”X”)的资料,很多人都不理解数据库连接为什么要用到这个,自己做了一下总结。
Class.forName(“X”) 返回与带有给定字符串名的类或接口相关联的Class
对象。
调用此方法等效于:
Class.forName(className, true, currentLoader)
参数:
name - 所需类的完全限定名
initialize - 是否必须初始化类
currentLoader - 用于加载类的类加载器
调用forName(“X”)将导致命名为X的类被初始化。
Class.forName(“X”) 与
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("X"); 的区别在于类是否被初始化。
只有执行clazz.newInstance();时才能够初始化类。
newInstance():创建此Class对象所表示的类的一个新实例。
看一下JDBC驱动的装载。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbcurl");
当调用Class.forName("com.mysql.jdbc.Driver");是Driver已经被初始化并注册到DriverManager中。
看一下MySQL Driver的代码:
public class Driver extends NonRegisteringDriver
implements java.sql.Driver
{
public Driver()
throws SQLException
{
}
static
{
try
{
DriverManager.registerDriver(new Driver());
}
catch(SQLException E)
{
throw new RuntimeException("Can't register driver!");
}
}
}
改修JDBC驱动的装载
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");
同样可以执行。但是这样就多构造了一个com.mysql.jdbc.Driver实例。同Class.forName("com.mysql.jdbc.Driver").newInstance()是一样的。是没有任何意义的。
为什么要用Class.forName()呢?
- Class.forName("com.mysql.jdbc.Driver");
- String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
- String user = "";
- String psw = "";
- Connection con = DriverManager.getConnection(url,user,psw);
- com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver()
- String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
- String user = "";
- String psw = "";
- Connection con = DriverManager.getConnection(url,user,psw);
使用new关键字时你得保证import了这个驱动类才行,而使用class.formname()时你只要保证引用了驱动的jar包就行了。
如果用new的话,当工程改变了数据库,你得修改.java文件和引入相应的驱动包。
而使用class.formname()时可以将驱动的类配置在xml文件中。加载驱动对象时修改xml和引入jar包就行了,就不需要大规模的改动整个代码了。