Class.forName()使用详解

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

这句话的作用是去加载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 {
	// 数据库连接url
	private 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();

			// 获取数据库url
			url = 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();

			// 获取数据库url
			url1 = 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();

			// 获取数据库url
			url = 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;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值