DBCP
一、前言
DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
二、DBCP使用
2.1、前期准备
2.1.1、添加依赖
<!--JDBC-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--DBCP-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
2.1.2、数据库建表
#创建测试数据库
CREATE DATABASE test1;
USE test1;
#创建需要的数据表
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
2.2、硬编码(不推荐)
硬编码指的是直接在代码里面设置,不利于将来项目的维护
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.*;
public class DBCPDemo {
public static void main(String []args) throws SQLException {
//创建连接池
BasicDataSource ds = new BasicDataSource();
//配置信息
//注意:mysql-connector-java 6要使用:com.mysql.cj.jdbc.Driver
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://ip:3306/test1?userUnicode=true&characterEncoding=utf-8&useSSL=false");
ds.setUsername("数据库用户");
ds.setPassword("数据库用户对应的密码");
//获取连接
Connection conn = ds.getConnection();
String sql = "insert into category values(?, ?);";
PreparedStatement st = conn.prepareStatement(sql);
//设置参数
st.setString(1, "c001");
st.setString(2, "C语言");
int i = st.executeUpdate();
System.out.println("执行影响数据:"+i);
closeResource(conn, st, null);
}
//释放资源
public static void closeResource(Connection conn, Statement st, ResultSet rs){
//释放连接
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
//释放语句执行者
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}
//释放结果集
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
}
2.3、配置文件(推荐)
主要将数据库驱动、url、用户名、密码等一些相关信息写入到配置文件中,程序在通过读取配置文件自动加载配置
2.3.1、配置文件
配置文件一般存放在Resources文件夹下
dbcp.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://数据库服务器ip:3306/test1?userUnicode=true&characterEncoding=utf-8&useSSL=false
username=用户名
password=密码
2.3.2、java代码
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class DBCPDemo {
public static void main(String []args) throws Exception {
//获取配置文件输入流
InputStream is = Thread.currentThread().getContextClassLoader().getSystemResourceAsStream("dbcp.properties");
Properties prop = new Properties();
prop.load(is);
String driverClassName = prop.getProperty("driverClassName");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
//创建连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
//获取连接
Connection conn = ds.getConnection();
//创建SQL
String sql = "insert into category values(?,?);";
//创建SQL语句执行者
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "c002");
st.setString(2, "C++语言");
//执行SQL
int i = st.executeUpdate();
System.out.println("执行影响数据:"+i);
closeResource(conn, st, null);
}
//释放资源
public static void closeResource(Connection conn, Statement st, ResultSet rs){
//释放连接
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
//释放语句执行者
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}
//释放结果集
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
}