破土朝阳

 

dbcp连接池的实现

使用dbcp连接池,首先要导入两个jar包:commons-dbcp_1.4.jar    和  commons_pool_1.5.6.jar 

自我总结dbcp有三种连接方式(不规范):手动(BasicDataSource),手动(Properties),自动

首先是手动连接,dbcp的jar包里面有个类是: BasicDataSource 来获取基本连接池对象,使用构造方法创建即可

代码如下:

package com;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
public class Test_dbcp {
    
    @Test
    public void test_dbcp() throws SQLException{
        
        //获取基本连接池对象  dbcp.jar包里的类
        BasicDataSource bds = new BasicDataSource();
        //设置连接数据库的四大必须条件
        bds.setDriverClassName("com.mysql.jdbc.Driver");
        bds.setUrl("jdbc:mysql:///bookmanagesystem");
        bds.setUsername("root");
        bds.setPassword("123456");
        //定义sql语句
        String sql = "select * from books";
        //获取连接
        Connection con = bds.getConnection();
        //执行sql语句
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        //判断是否连接成功
        while(rs.next()){
            
            System.out.println("可以查询到books表里的数据");        
        }
        //连接池的close()是把连接对象放回连接池,而不是关闭连接
        rs.close();
        ps.close();
        con.close();     
        
    }

}

手动,通过Properties类 和 BasicDataSourceFactory的静态方法DataSource    createDataSource()获取连接的数据库:

代码如下:

@Test
    public void test_dbcp2() throws Exception{
                //获取Properties对象
                Properties ps = new Properties();
                //设置要连接的数据库:注意:前一个值必须是:driverClassName,url,username,password
                ps.setProperty("driverClassName", "com.mysql.jdbc.Driver");
                ps.setProperty("url", "jdbc:mysql:///bookmanagesystem");
                ps.setProperty("username", "root");
                ps.setProperty("password", "123456");
                //创建连接池,DataSource类有个方法是getConnection()得到连接对象
                DataSource ds  = BasicDataSourceFactory.createDataSource(ps);
        
                //定义sql语句
                String sql = "select * from books";
                //获取连接
                Connection con = ds.getConnection();
                //执行sql语句
                PreparedStatement p = con.prepareStatement(sql);
                ResultSet rs = p.executeQuery();
                //判断是否连接成功
                while(rs.next()){
                    
                    System.out.println("可以查询到books表里的数据");        
                }
                //连接池的close()是把连接对象放回连接池,而不是关闭连接
                rs.close();
                con.close();
        
    }

自动连接,通过配置一个properties的配文件实现,注意的是,配置文件的key值必须是:driverClassName,url,username,password

Properties的方法load(FileInputStream fis)加载配置文件

配置文件 dbcp.properties内容如下:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///bookmanagesystem
username=root
password=123456

自动连接代码如下:

@Test
    public void test_dbcp3() throws Exception{
        //定义Properties对象
        Properties ps = new Properties();
        //获取配置文件
        FileInputStream fis =  new FileInputStream("D:\\MyEcli[se\\workspace\\testJDCP\\src\\dbcp.properties");
        //加载配置文件
          ps.load(fis);
        //加载连接池
          DataSource ds  = BasicDataSourceFactory.createDataSource(ps);
            
          //定义sql语句
            String sql = "select * from books";
            //获取连接
            Connection con = ds.getConnection();
            //执行sql语句
            PreparedStatement p = con.prepareStatement(sql);
            ResultSet rs = p.executeQuery();
            //判断是否连接成功
            while(rs.next()){
                
                System.out.println("可以查询到books表里的数据");        
            }
            //连接池的close()是把连接对象放回连接池,而不是关闭连接
            rs.close();
            con.close();
        

另外扩展一下:可以用Properties类(import java.util.Properties;包里的)的setProperty(String,String)方法设置连接的数据库的四大条件的值,这样就不需要用dbcp连接池,不需要导入jar包:

关键代码:

public class DB {
    private static Properties properties=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;
    private static String driver=null;
    private static Connection con=null;
/*
 *    这里用到了Properties类   
 *    不需要配置文件,不需要dbcp连接
 *    只要用setProperty()和getProperty()
 * */

    public static Connection getConnecttion(){           
        properties=new Properties();                     
        try {
            //设置连接的数据库四大必须条件
            properties.setProperty("driver","com.mysql.jdbc.Driver");
            properties.setProperty("url","jdbc:mysql:///my");
            properties.setProperty("username","root");
            properties.setProperty("password","123456");

           //得到连接的数据库
            driver=properties.getProperty("driver");
            url=properties.getProperty("url");
            username=properties.getProperty("username");
            password=properties.getProperty("password");
            
            
            //加载驱动
            Class.forName(driver);
            //获取链接
            con= DriverManager.getConnection(url,username,password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

会发现其实上面没啥用,可以直接把值给driver,url,username,password就好了。这样就是存了一遍,取了一遍赋值。

posted on 2020-06-18 02:08  破土朝阳  阅读(127)  评论(0编辑  收藏  举报

导航