Class.forName()使用详解

来源:互联网 发布:淘宝助理 未知错误 1 编辑:程序博客网 时间:2024/04/30 02:33

首先要搞清楚这句话的作用是什么。

这句话的作用是去加载org.git.mm.mysql.Driver这个类,加载类有两种方式既Class.forName(classname)和ClassLoader.getSystemClassLoader().loadClass("")用哪个都可以,不过这个方法的一个好处在于它不是写死的而是根据传入的字符串动态进行变化的,因此这个字符串也同样可以写进配置文件里面,所以这就为驱动的灵活配置提供的条件。


那加载这个类有什么用呢?


加载的这个类的时候类里面的static块里面的代码会被执行,而org.git.mm.mysql.Driver类是这么定义的:

package org.gjt.mm.mysql;import java.sql.SQLException;public class Driver extends com.mysql.jdbc.Driver{  public Driver()    throws SQLException  {  }}

再看看


com.mysql.jdbc.Driver类是如何定义的

package com.mysql.jdbc;import java.sql.DriverManager;import java.sql.SQLException;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!");    }  }}

这里面就有一个static块,所以当org.git.mm.mysql.Driver被加载的时候,static块就会被执行,执行的目的就在于向java.sql.DriverManager类注册自己,就是把自己本身类注册给DriverManger(注册的目的在于可以让DriverManager可以同时管理多个数据库连接,因为有的时候我们需要在同一个程序中连接多个数据库,这个时候必然要求我们要把所有的数据库连接都管理起来,可以确保我们获取的是我们指定的连接),然后我们再看一个获取Connection的方法。

package com.dada.conn;import java.sql.Connection;import java.sql.DriverManager;public class TestMysql {public Connection getConn(String url, String user, String pwd) {Connection conn = null;try {// Class.forName("org.gjt.mm.mysql.Driver");ClassLoader.getSystemClassLoader().loadClass("org.gjt.mm.mysql.Driver");conn = DriverManager.getConnection(url, user, pwd);} catch (Exception e) {e.printStackTrace();}return conn;}}


首先是要加载这个org.git.mm.mysql.Driver类,之后获取连接,其实这个连接方法的实现还是在org.git.mm.mysql.Driver里面的;


下面一个同时管理多个连接的例子:

package com.hdxinfo.connetion;import java.sql.Connection;import java.sql.DriverManager;import java.util.Properties;import java.io.InputStream;public class ConnectionsManager {// 数据库连接urlprivate static String url;//private static String url1;// 用户名private static String user;// 数据库密码private static String password;// properties对象private static Properties ps;// 输入流private static InputStream fis;/** * 获取mysql连接 *  * @return * @throws Exception */public static Connection getMysqlConn() {Connection conn = null;try {// 获取输入流//这种获取输入流的方式是最好的,无论你把配置文件放在什么地方,它都会去自动的查找它的//因此无论是开发j2se项目还是j2ee的项目都应该使用这种加载的方式。fis = ConnectionsManager.class.getClassLoader().getResourceAsStream("db.properties");ps = new Properties();// 把流加载到内存中ps.load(fis);// 关闭流fis.close();// 获取数据库urlurl = ps.getProperty("db_url_mysql");// 获取用户名user = ps.getProperty("username");// 获取密码password = ps.getProperty("password");// 获取连接conn = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return conn;}public static Connection getMysqlConn1() {Connection conn = null;try {// 获取输入流//这种获取输入流的方式是最好的,无论你把配置文件放在什么地方,它都会去自动的查找它的//因此无论是开发j2se项目还是j2ee的项目都应该使用这种加载的方式。fis = ConnectionsManager.class.getClassLoader().getResourceAsStream("db.properties");ps = new Properties();// 把流加载到内存中ps.load(fis);// 关闭流fis.close();// 获取数据库urlurl1 = ps.getProperty("db_url_mysql1");// 获取用户名user = ps.getProperty("username");// 获取密码password = ps.getProperty("password");// 获取连接conn = DriverManager.getConnection(url1, user, password);} catch (Exception e) {e.printStackTrace();}return conn;}/** * 获取oracle连接 *  * @return * @throws Exception */public static Connection getOracleConn() throws Exception {Connection conn = null;try {// 获取输入流fis = ConnectionsManager.class.getClassLoader().getResourceAsStream("db.properties");ps = new Properties();// 把流加载到内存中ps.load(fis);// 关闭流fis.close();// 获取数据库urlurl = ps.getProperty("db_url_oracle");// 获取用户名user = ps.getProperty("username");// 获取密码password = ps.getProperty("password");// 获取连接conn = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return conn;}}




原创粉丝点击