1) 什么是连接池
2) 连接池的好处
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。
这样应用程序可以方便的切换不同厂商的连接池。
## 创建员工表 create table employee ( eid int primary key auto_increment , ename varchar (20), -- 员工姓名 age int , -- 员工年龄 sex varchar (6), -- 员工性别 salary double , -- 薪水 empdate date -- 入职日期 ); -- 插入数据 insert into employee (eid, ename, age, sex, salary, empdate) values(null,'田甜',22,'女',4000,'2018-11-12'); insert into employee (eid, ename, age, sex, salary, empdate) values(null,'杨帆',20,'女',5000,'2019-03-14'); insert into employee (eid, ename, age, sex, salary, empdate) values(null,'侯大力',40,'男',6000,'2020-01-01'); insert into employee (eid, ename, age, sex, salary, empdate) values(null,'夏雨',25,'男',3000,'2017-10-01'); -- 查询数据 select * from employee;
<!--dbcp连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version> </dependency>
连接数据库表的工具类, 采用DBCP连接池的方式来完成
package cn.guardwhy.utils; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBCPUtils { //1. 定义字符串常量, 获取连接所需要的信息 public static final String DRIVERNAME = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/db_jdbc? characterEncoding=UTF-8"; public static final String USERNAME = "root"; public static final String PASSWORD = "root"; // 2.创建连接池对象(有dbcp提供的实现类) public static BasicDataSource dataSource = new BasicDataSource(); // 3.使用静态代码块进行配置 static { dataSource.setDriverClassName(DRIVERNAME); dataSource.setUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); } // 4.获取连接的方法 public static Connection getConnection() throws SQLException { // 4.1 从连接池中获取连接 Connection connection = dataSource.getConnection(); return connection; } // 5.释放资源 public static void close(Connection connection, Statement statement){ // 5.1 条件判断 if(connection != null && statement != null){ try { statement.close(); // 5.2 归还连接 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } // 6.关闭连接 public static void close(Connection connection, Statement statement, ResultSet resultSet){ // 6.1 条件判断 if(connection != null && statement != null && resultSet != null){ try { resultSet.close(); statement.close(); // 6.1 归还连接 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
需求: 查询所有员工的姓名
package cn.guardwhy.test; import cn.guardwhy.utils.DBCPUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /* * 测试dbcp连接池 */ public class TestDbcp { public static void main(String[] args) throws SQLException { // 1.从dbcp连接池中拿到连接对象 Connection connection = DBCPUtils.getConnection(); // 2. 获取statement对象 Statement statement = connection.createStatement(); // 3.查询所有员工的姓名 String sql = "select ename from employee"; ResultSet resultSet = statement.executeQuery(sql); // 4.处理结果集 while (resultSet.next()){ String ename = resultSet.getString("ename"); System.out.println("员工姓名:" + ename); } // 5.释放资源 DBCPUtils.close(connection, statement, resultSet); } }
1) 执行结果
Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/db_jdbc?characterEncoding= UTF-8&rewriteBatchedStatements=true username=root password=root initialSize=5 maxActive=10 maxWait=3000
获取数据库连接池对象
package cn.guardwhy.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class DruidUtils { //1.定义成员变量 public static DataSource dataSource; //2.静态代码块 static{ try { //3.创建属性集对象 Properties p = new Properties(); //4.加载配置文件 Druid 连接池不能够主动加载配置文件 ,需要指定文件 InputStream inputStream = DruidUtils.class.getClassLoader(). getResourceAsStream("druid.properties"); //5. 使用Properties对象的 load方法 从字节流中读取配置信息 p.load(inputStream); //6. 通过工厂类获取连接池对象 dataSource = DruidDataSourceFactory.createDataSource(p); } catch (Exception e) { e.printStackTrace(); } } //获取连接的方法 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); return null; } } //获取Druid连接池对象的方法 public static DataSource getDataSource(){ return dataSource; } //释放资源 public static void close(Connection con, Statement statement){ if(con != null && statement != null){ try { statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } } } // 释放资源 public static void close(Connection con, Statement statement, ResultSet resultSet){ if(con != null && statement != null && resultSet != null){ try { resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
需求: 查询薪资在3000 - 5000元之间的员工姓名
package cn.guardwhy.test; import cn.guardwhy.utils.DruidUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestDruid { // 需求 查询 薪资在3000 到 5000之间的员工的姓名 public static void main(String[] args) throws SQLException { //1.获取连接 Connection con = DruidUtils.getConnection(); //2.获取Statement对象 Statement statement = con.createStatement(); //3.执行查询 ResultSet resultSet = statement.executeQuery ("select ename from employee where salary between 3000 and 5000"); //4.处理结果集 while(resultSet.next()){ String ename = resultSet.getString("ename"); System.out.println(ename); } //5.释放资源 DruidUtils.close(con,statement,resultSet); } }