目录

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

目录

多种的方法得到数据库的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 的内容

    1. 创建 ComboPooledDataSource 实例;
  • DataSource dataSource =

new ComboPooledDataSource(“helloc3p0”);

    1. 从 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());

}