多种的方法得到数据库的connection

第一种方式得到连接:数据库厂商必须实现的接口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()); 
}



 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值