- C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml.
- 使用C3P0需要添加c3p0-0.9.1.2.jar
通过硬编码来编写
- 创建C3P0连接池对象
- 设置连接池参数
- 获得连接
- 预编译sql语句,得到预编译对象
- 设置sql语句参数
- 执行sql语句,处理结果
- 释放资源
package com.c3p0;
import bean.JDBCUtils;
import com.Utils.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @Author: Mr.Xu
* @description: c3p0连接池 硬编码的方式
* @Date: 2021/10/16 10:18
*/
public class Test_1 {
public static void main(String[] args) throws Exception {
//硬编码模式
// - 创建C3P0连接池对象
ComboPooledDataSource dateSource = new ComboPooledDataSource();
// - 设置连接池参数
dateSource.setDriverClass("com.mysql.jdbc.Driver");
dateSource.setJdbcUrl("jdbc:mysql://localhost:3306/day19_1");
dateSource.setUser("root");
dateSource.setPassword("toor");
dateSource.setInitialPoolSize(5);
// - 获得连接
Connection connection = dateSource.getConnection();
// - 预编译sql语句,得到预编译对象
String sql = "select * from user where id = ?";
PreparedStatement pps = connection.prepareStatement(sql);
// - 设置sql语句参数
pps.setInt(1,1);
// - 执行sql语句,处理结果
ResultSet resultSet = pps.executeQuery();
// - 定义user变量存储数据,初始值为null
User user = null;
//循环遍历表中数据
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String nickname = resultSet.getString("nickname");
user = new User(id,username,password,nickname);
System.out.println(user);
}
// - 释放资源
JDBCUtils.release(resultSet, pps,connection);
//打印结果
System.out.println(user);
}
}
通过配置文件来编写
思路:
- 拷贝c3p0-config.xml配置文件到src路径下,然后修改配置文件中的参数值
- 配置文件名一定不能修改
- 配置文件一定要放在src路径下
- 配置文件中标签的name属性值要与setXXX方法的方法名对应( set方法去掉set,然后首字母变小写)
- 创建C3P0连接池对象------>自动读取src路径下的c3p0-config.xml配置文件
- 通过连接池对象获得连接对象
- 预编译sql语句,得到预编译对象
- 设置参数
- 执行sql语句,处理结果
- 释放资源
package com.c3p0;
import com.Utils.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @Author: Mr.Xu
* @description: 通过配置文件编写
* @Date: 2021/10/14 20:54
*/
public class Test_2 {
public static void main(String[] args) throws Exception{
//创建c3p0对象
ComboPooledDataSource ps = new ComboPooledDataSource();
//获取连接
Connection connection = ps.getConnection();
//预编译sql语句,得到预编译对象
String sql = "select * from user where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
//设置参数
statement.setInt(1,5);
//执行sql语句,处理结果
ResultSet resultSet = statement.executeQuery();
//定义user变量,赋初始值为null
User user = null;
//循环获取数据
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String nickname = resultSet.getString("nickname");
user = new User(id,username,password,nickname);
}
//释放资源
// JDBCUtils.release(resultSet,ps,connection);
//打印结果
System.out.println(user);
}
}
使用c3p0改写工具类
-
问题: 每次需要连接的时候,都需要创建连接池对象,用完了就销毁,所以就会不断的创建连接池,销毁连接池
-
解决: 整个程序只需要创建一个连接池对象,其余地方直接使用这个唯一的连接池对象获得连接即可
- 工具类:
- 思路:
- 创建唯一的连接池对象---->private static final修饰
- 提供一个获取连接池对象的静态方法
- 提供一个获取连接的静态方法
- 提供一个释放资源的静态方法
工具类:
package com.Utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Author: Mr.Xu
* @description: 提取 c3p0 工具类
* @Date: 2021/10/14 21:28
*/
public class c3p0Utils {
// - 创建唯一的连接池对象---->private static final修饰
private static final ComboPooledDataSource cps = new ComboPooledDataSource();
// - 提供一个获取连接池对象的静态方法
public static DataSource getDataSources(){
return cps;
}
// - 提供一个获取连接的静态方法
public static Connection getConnection() throws SQLException {
return cps.getConnection();
}
// - 提供一个释放资源的静态方法
public static void release(ResultSet resultSet, Statement statement,Connection connection) throws SQLException {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
}
}
实现:
package com.c3p0;
import com.Utils.User;
import com.Utils.c3p0Utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @Author: Mr.Xu
* @description: 通过工具类的方式实现增删改查
* @Date: 2021/10/14 21:44
*/
public class Test_03 {
public static void main(String[] args) throws Exception{
//获得驱动,获得连接
Connection connection = c3p0Utils.getConnection();
//预编译sql语句,获得对象
String sql = "select * from user where id = 4";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 执行sql语句
ResultSet resultSet = preparedStatement.executeQuery();
//定义变量存放数据,初始值为null
User user = null;
//循环遍历表中数据
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String nickname = resultSet.getString("nickname");
user = new User(id,username,password,nickname);
System.out.println(user);
}
//释放资源
c3p0Utils.release(resultSet,preparedStatement,connection);
}
}