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

来源:互联网 发布:会员购淘宝u站 编辑:程序博客网 时间:2024/05/29 17:16

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



 





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩爱动怎么办补什么 初中孩子下午上课总犯困怎么办 孩子上课精神不集中怎么办 孩子玩兴奋了就打人怎么办 婴儿兴奋白天不睡觉怎么办 小孩读书精神不集中怎么办 小孩上课精神不集中怎么办 小孩学习精神不集中怎么办 孩子暑假天天看电视不出门怎么办 七个月宝宝缺铁怎么办 天天运动为什么还便秘怎么办 小孩学习注意力不集中怎么办 8个月宝贝太好动怎么办 学生在校受伤家长该怎么办 多动症小孩爱动手指怎么办 孩子大了不听话该怎么办 流产后吹了风怎么办 怀孕1周内喝酒了怎么办 怀孕6周喝酒了怎么办 怀孕后喝了酒怎么办 不知道怀孕喝酒了怎么办 不知道怀孕了喝酒了怎么办 怀孕5天喝酒了怎么办 打孩子耳光后脸肿了怎么办 老师说上课不专心怎么办 孩子不专心好动马虎怎么办 学生上课不认真听讲怎么办 一年级孩子上课不注意听讲怎么办 一年级孩子上课说话不听课怎么办 一年级孩子上课不听课怎么办 小学一年级学生上课不专心怎么办? 小孩听课注意力不集中怎么办 小孩子上课精神不集中怎么办 孩子说我不画了怎么办 幼儿园小朋友上课不专心怎么办 孩子写作业不专心怎么办 小孩做作业不专心怎么办 孩子上课精力不集中怎么办 四岁宝宝吃饭慢怎么办 5岁宝宝吃饭慢怎么办 小学一年级上课不专心怎么办