package tan.com;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;

public class TestJDBC {
	/**第一种实现方法------>
	 * Driver 是一个接口: 数据库厂商必须提供实现的接口. 能从其中获取数据库连接.
	 * 可以通过 Driver 的实现类对象获取数据库连接.
	 * 
	 * 1. 加入 mysql 驱动
	 * 1). 解压 mysql-connector-java-5.1.7.zip
	 * 2). 在当前项目下新建 lib 目录
	 * 3). 把 mysql-connector-java-5.1.7-bin.jar 复制到 lib 目录下
	 * 4). 右键 build-path , add to buildpath 加入到类路径下.s
	 * @throws SQLException 
	 */
	@Test
	public void testDriver() throws SQLException {
	//1.创建一个Driver实现类的对象
	Driver driver=new com.mysql.jdbc.Driver();
	//2.准备连接数据库的基本信息
	String url="jdbc:mysql://localhost:3306/tan";
	Properties info=new Properties();
	info.put("user", "root");
	info.put("password", "1234");
	//调用Driver接口的connect(url,info)获取数据库的连接。
	Connection connection=driver.connect(url,info);
	System.out.println(connection);

	}
/**第二种实现方法------>通用的实现方法
 * 通过反射以及读取配置文件的方式来获取数据库连接
 * 编写的通用方法在不修改源程序的情形下可以获取任何数据库的连接
 * 解决方法:把数据库驱动Driver实现类的全类名、url、user、password
 * 放入一个配置文件中,通过修改配置文件的方式实现和具体的数据库解耦。
 * @throws Exception 
 */
	public Connection getConnection() throws  Exception{
		    String driverClass = null;
			String jdbcUrl=null;
			String user=null;
			String password=null;
		    //读取类路径下的jdbc.properties文件
			InputStream in=
			getClass().getClassLoader().getResourceAsStream("jdbc.properties");
			Properties properties =new Properties();
			properties.load(in);

			//通过反射创建 Driver 对象. 
			driverClass=properties.getProperty("driver");
			jdbcUrl=properties.getProperty("jdbcUrl");
			user=properties.getProperty("user");
			password=properties.getProperty("password");
			//调用Driver接口的connect(url,info)获取数据库的连接。	
			Driver driver=(Driver) Class.forName(driverClass).newInstance();
			
			Properties info=new Properties();
			info.put("user", user);
			info.put("password", password);
			Connection connection=driver.connect(jdbcUrl, info);
			
		
			return connection;
	}
	@Test
	public void testGetConnection() throws Exception{
		System.out.println(getConnection());
		System.out.println("Hello");
	}
	/**第三种利用驱动管理类来轻松实现---->
	 * 
	 * DriverManager 是驱动的管理类. 
	 * 1). 可以通过重载的 getConnection() 方法获取数据库连接. 较为方便
	 * 2). 可以同时管理多个驱动程序: 若注册了多个数据库连接, 则调用 getConnection()
	 * 方法时传入的参数不同, 即返回不同的数据库连接。 
	 * @throws Exception 
	 * @throws Exception 
	 */
	
	@Test
	public void textDriverMangager() throws Exception{
				//1. 准备连接数据库的 4 个字符串. 
				   //驱动的全类名.
				String driverClass = "com.mysql.jdbc.Driver";
				//JDBC URL
				String jdbcUrl = "jdbc:mysql:///tan";
				//user
				String user = "root";
				//password
				String password = "1234";
				
				//2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)
				Class.forName(driverClass);
				
				//3. 通过 DriverManager 的 getConnection() 方法获取数据库连接. 
				Connection connection = 
						DriverManager.getConnection(jdbcUrl, user, password);
				System.out.println(connection); 
				connection.close();
	
	}
	/**
	 * 第四种方法:利用DriverManager管理类读取资源文件,方法灵活,充分解耦
	 *  缺陷:每次调用都要读取配置文件,在实际项目中只需要读一次即可。
	 *  (有待加强,但是这个代码本身是不错的)            
	 * @throws Exception
	 */
	@Test
	public void testGetConnection2() throws Exception{
		System.out.println(getConnection2()); 
	}
	
	public Connection getConnection2() throws Exception{
		//1. 准备连接数据库的 4 个字符串. 
		//1). 创建 Properties 对象
		Properties properties = new Properties();
		
		//2). 获取 jdbc.properties 对应的输入流
		InputStream in = 
				this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
		
		//3). 加载 2) 对应的输入流
		properties.load(in);
		
		//4). 具体决定 user, password 等4 个字符串. 
		String user = properties.getProperty("user");
		String password = properties.getProperty("password");
		String jdbcUrl = properties.getProperty("jdbcUrl");
		String driver = properties.getProperty("driver");
		
		//2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)
		Class.forName(driver);
		
		//3. 通过 DriverManager 的 getConnection() 方法获取数据库连接. 
		return DriverManager.getConnection(jdbcUrl, user, password);
	}
}
jdbc.properties文件

driver=com.mysql.jdbc.Driver

jdbcUrl=jdbc:mysql://localhost:3306/tan


user=root


password=1234