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就好了。这样就是存了一遍,取了一遍赋值。