第一种方式得到连接:数据库厂商必须实现的接口Driver,当连接数据库是别忘了添加相应的数据库驱动jar包。


最原始的Driver 接口实现获取connection:

Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现

@Test
 public void testDriver() throws SQLException{
//1.创建一个Driver实现类的对象
Driver driver=new Driver();
//2.准备连接数据库的基本信息:url、user、password
String url="jdbc:mysql://localhost:3306/bookstore";
java.util.Properties info=new java.util.Properties();
info.put("user","root");
info.put("password","");
//3.调用Driver接口的connect(url,info)获取数据库连接

Connection connection= driver.connect(url, info);
System.out.println(connection);
 }driver接口提供了得到connection的方法:
Connection connect(String url,
                    Properties info)
                    throws SQLException在运行中出现了这种错误:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)
解决的方案:将root用户的password设置为空。

G:\mysql-5.5.41-winx64\bin>mysql -u root -p
 Enter password: ******mysql> use mysql;
ERROR 1049 (42000): Unknown database 'mysql;'
mysql> use mysql;
Database changed
 mysql> update user set password=password('') where user='root';
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0
 mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

第二种方式:通过修改配置文件的方式实现和具体的数据库解耦

/*编写一个通用的方法,在不改变源程序的情况下,
  * 可以获取任何数据库的连接。
  * 解决方法:把数据库驱动Driver实现累的全类名
  * url、user、password放入一个配置一个文件中
  * 通过修改配置文件的方式实现和具体的数据库解耦
  */


 public Connection getconnection() throws 
 InstantiationException, IllegalAccessException, 
 ClassNotFoundException, SQLException, IOException{
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("driverClass");
jdbcUrl=properties.getProperty("jdbcUrl");
user=properties.getProperty("user");
password=properties.getProperty("password");

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 InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException, IOException{
System.out.println(getconnection());
 }
配置文件:jdbc.properties
driverClass=com.mysql.jdbc.Driver
 jdbcUrl=jdbc:mysql://localhost:3306/bookstore
 user=root
 password=root


 #driverClass=oracle.jdbc.driver.OracleDriver
 #jdbcUrl=jdbc:oracle:thin:@localhost:1521:oracle
 #user=scott
 #password=tiger
第三种方式://3、通过DriverManager的getconnection()方法获取数据连接。 
@Test
public void TestDriverManager() throws IOException, ClassNotFoundException, SQLException{
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("driverClass");
jdbcUrl=properties.getProperty("jdbcUrl");
user=properties.getProperty("user");
password=properties.getProperty("password");
//2、加载数据库驱动程序(注册驱动)
Class.forName(driverClass);
//3、通过DriverManager的getconnection()方法获取数据连接。
Connection connection=(Connection) DriverManager.getConnection(jdbcUrl,user, password);
System.out.println(connection);
}
通过DriverManager类中的static Connection getConnection(String url, Properties info) 。
第四种方式:DBCP共享池
DBCP 数据源 
DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool. 如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
 Commons-dbcp.jar:连接池的实现
 Commons-pool.jar:连接池实现的依赖库
 Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
DBCP 数据源使用范例
数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。@Test
public void testDBCP() throws SQLException{
BasicDataSource dataSource=null;
//1.建立创建DBPC数据源实例
dataSource=new BasicDataSource();
//2.为数据源实例指定必须的属性
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql://localhost:3306/atguigu");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");

//指定数据源的一些可选的属性

//1、指定数据库连接池中初始连接数的个数
dataSource.setInitialSize(10);

//2、指定最大的连接数:同一时刻可以同时向数据库申请的连接数
dataSource.setMaxActive(50);

//3、指定最小连接数:在数据库连接池中保存最少的空闲的连接的数量
dataSource.setMinIdle(5);

//4、等待数据库连接池分配连接的最长时间,单位为毫秒,超出该时间抛出异常
dataSource.setMaxWait(1000*5);


//3、从数据库中获取数据库连接
Connection connection=dataSource.getConnection();
System.out.println(connection);
}

通过DBCP共享池中的 BasicDataSourceFactory:

@Test

public void testDBCPWithDataSourceFactory() throws Exception{
Properties properties=new Properties();

InputStream inputStream=JDBCTest.class.getClassLoader()
.getResourceAsStream("dbcp.properties");
properties.load(inputStream);

        javax.sql.DataSource dataSource=
       BasicDataSourceFactory.createDataSource(properties);
        
   System.out.println(dataSource.getConnection());
BasicDataSource basicDataSource=(BasicDataSource) dataSource;
System.out.println(basicDataSource.getMaxWait());
}

第五种方式:c3p0共享池

/**
* 1. 创建 c3p0-config.xml 文件, 
* 参考帮助文档中 Appendix B: Configuation Files 的内容
* 2. 创建 ComboPooledDataSource 实例;
* DataSource dataSource = 
* new ComboPooledDataSource("helloc3p0");  
* 3. 从 DataSource 实例中获取数据库连接. 
*/
@Test
public void testC3poWithConfigFile() throws Exception{
DataSource dataSource = 
new ComboPooledDataSource("helloc3p0");  

System.out.println(dataSource.getConnection()); 

ComboPooledDataSource comboPooledDataSource = 
(ComboPooledDataSource) dataSource;
System.out.println(comboPooledDataSource.getMaxStatements()); 
}

/**
* 
* @throws PropertyVetoException
* @throws SQLException
*/
@Test
public void testC3p0() throws PropertyVetoException, SQLException{
ComboPooledDataSource cpds = new ComboPooledDataSource();

cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver            
cpds.setJdbcUrl( "jdbc:mysql:///atguigu" );
cpds.setUser("root");   
cpds.setPassword("root");   

System.out.println(cpds.getConnection()); 
}