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