传智博客---JDBC之获取数据库连接的从不通用到通用的方法:

package com.zhou.jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import org.junit.Test;
import com.mysql.jdbc.Driver;
public class JDBC_Test {
/**
* 首先我们要说一下这个Driver是什么: 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 加入到类路径下
*
* @throws Exception
*/
@Test
public void test_Driver() throws Exception {
// 1.创建一个Driver实现类对象;
Driver driver = new Driver();
// 连mysql需要一个url:这个url怎么写?
/**
* jdbc:<子协议>:<子名称> 协议:JDBC URL中的协议总是jdbc 子协议:子协议用于标识一个数据库驱动程序
* 子名称:一种标识数据库的方法。子名称可以依不同的子 协议而变化,用子名称的目的是为了定位数据库提 供足够的信息
*/
// 2.准备连接数据库的基本信息:url、user、password;
String url = "jdbc:mysql:///zhouzhigang";
//"jdbc:mysql://127.0.0.1:3306/zhouzhigang";
                  /*
                   * 如果这个时候是127.0.0.1:3306或localhost:3306的话可以省略这样写:
                   *   String url = "jdbc:mysql:///zhouzhigang";
                   */
// 需要一个Properties类的对象;
Properties info = new Properties();
// properties里面需要写什么呢?
info.put("user", "root");
info.put("password", "mysqladmin");
// 3.调用Driver接口的connect(url,info)方法获取数据库连接;
// 我们来获取数据库连接:提供好url和Properties之后呢,它可以得到一个Connection对象:
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;
*/
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);
// 然后一个一个读出来吧:
driverClass = properties.getProperty("dirver");
jdbcUrl = properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
/**
* 比方说我上面那四个现在已经搞定了,那我后边我如何去连数据库啊;
* Driver还是要的,之前那个是new的,现在这个是不是不能new了啊,我是不是知道全类名啊 第一个搞定;
*/
//通过反射创建Driver的对象;
Driver driver = (Driver) Class.forName(driverClass).newInstance();// 这就是反射,它可以充分的让数据库解耦;
/**
* 第二个:我要获取一个Connection:
* driver.connect(url,info),是不是需要一个url和一个Properties啊
* ,url写好了,来写Properties:
*/
Properties info = new Properties();
info.put("user", user);// 注意,这个键必须是user,这个值我可以改;
info.put("password", password);
//通过Driver的connect方法获取数据库的连接
Connection connection = driver.connect(jdbcUrl, info);
// 我的目标是返回一个Connection;
return connection;
/**
* 现在来看,我目前这个方法,是不是还没有和任何数据库厂商的API相耦合啊;如果这个driverClass、
* jdbcUrl、user、password从一个文件中读出来,我这个Driver是接口吧,后面是反射吧;
* Properties是javaSE里面的一个类;Connection是接口吧,返回也是接口的一个实现类对象,
* 这样写的话,这个方法就没有跟任何一个数据库的API相耦合,那这个时候这个方法就是通用的,而上面写的第
* 一个方法不是通用的;我们希望我们能够写出许多通用的代码;
*/
}
/**
* 现在来测试洗这个 public Connection getConnection()方法:
* @throws Exception
*/
@Test
public void testGetConnection() throws Exception {
//直接打印:
System.out.println(getConnection());
}
/**
* DriverManager:是驱动的管理类;
* 1).可以通过重载的getConnection()方法获取数据库连接,较为方便; *
* 2).可以同时管理多个驱动程序:若注册了多个数据库连接,则调用getConnection()方法时传入的参数不同,即返回不同的数据库连接;
*
* @throws Exception
*/
@Test
public void testDriverManager() throws Exception{
/**
* 具体步骤是这样的:比方说,我现在已经有了 String driverClass = null; String jdbcUrl =
* null; String user = null; String password = null;
*/
//1.准备连接数据库的四个字符串:
 //Driver接口实现类的全类名:
String driverClass = null;
 //JDBC URL:
String jdbcUrl = null;
 //user:
String user = null;
 //password:
String password = null;
//2.读取配置文件:
// 读取类路径下的jdbc.properties文件:
InputStream in = getClass().getClassLoader().getResourceAsStream(
"jdbc.properties");
// 然后呢?
Properties properties = new Properties();
properties.load(in);
// 然后一个一个读出来吧:
driverClass = properties.getProperty("dirver");
jdbcUrl = properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
//3.加载数据库驱动程序(实际上这一步应该叫:注册驱动,对应的Driver实现类中有注册驱动的静态代码块):
/**
* 这一步实际上应该这样写DriverManager.registerDriver(driver);注册一个驱动程序;
* 那注册驱动我们应该怎么办呢?我们实际上应该是创建一个Driver的实现类对象;
* 实际上应该这么写:DriverManager.registerDriver(Class.forName(driverClass).newInstance());
* 那为什么我们不这么写也可以呢?是因为我们在加载驱动的时候,我这个对应驱动里面有一个静态代码块,那个静态代码块会被执行。
*/
Class.forName(driverClass);
//4.通过DriverManager的getConnection(jdbcUrl, user, password)方法获取数据库的连接;
/**
* 这个DriverManager有什么特点呢?这个时候我们可以直接用它给我们提
* 供的getConnection方法来获取数据库的连接,这个时候这个方法是重载的
* 也就是说,用这个驱动的管理类比直接使用Driver更方便;
*
* 那用这个DriverManager的好处是什么呢?它的好处就是:它可以往里面注册多个驱动程序;
*    那你只需要这个jdbcUrl不一样的话,我就可以来连接不同的数据库;
*    
*    我们这里面除了看见用这个DriverManager的重载方法获取连接比较简单之外,它还有一个好处就是它可以来管理多个驱动程序;
*/
  Connection connection =
       DriverManager.getConnection(jdbcUrl, user, password);//我直接可以通过这个方法来获取数据库的连接,返回一个Connection;
  //现在来打印一下:
  System.out.println(connection);
}
/**
* 用DriverManager来把之前那个通用的方法写一遍:
* @throws Exception
*/
public Connection getConnection2() throws Exception{
//1.准备连接数据库的四个字符串:
 //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、jdbcUrl、driverClass四个字符串:
  String user = properties.getProperty("user");
  String password = properties.getProperty("password");
  String jdbcUrl = properties.getProperty("jdbcUrl");
  String driverClass = properties.getProperty("dirver");
//2.加载数据库驱动程序(实际上这一步应该叫:注册驱动,对应的Driver实现类中有注册驱动的静态代码块):
  Class.forName(driverClass);
//3.获取数据库的连接:
//    Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
//    return connection;
  return DriverManager.getConnection(jdbcUrl, user, password);
   }
   /**
    * 来测试一下getConnection2()方法:
    * @throws Exception
    */
   @Test
   public void testGetConnection2() throws Exception{
System.out.println(getConnection2());
   }
}

wKioL1MgZ1GTn8evAADB24MWEZ8087.jpg

本文出自 “IT技术JAVA” 博客,转载请与作者联系!

你可能感兴趣的:(从不通用到通用的方法)