连接池
- 概述:连接池就是一个装有与数据库连接的容器,通过连接池预先同数据库建立一些连接放在内存中,当应用程序需要建立连接时直接从连接池中申请一个使用,使用完毕后在归还给连接池
- 为什么要有连接池?
建立与数据库的连接是一种非常耗时,耗资源的行为,可以通过使用连接池早已建立好的连接优化这一行为 - 三种常见的连接池:DBCP连接池,c3p0连接池,阿里德鲁伊Druid连接池
DBCP连接池
使用步骤:
(1)引入数据库驱动jar包和DBCP两个jar包
(2)导入配置文件
(3)两种使用方式
方式1:硬编码,不用配置文件:
package org.westos.demo;
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
//导入数据库驱动jar包和两个DBCPjar包
//创建连接池对象
BasicDataSource bd = new BasicDataSource();
//设置四个基本参数
bd.setDriverClassName("com.mysql.jdbc.Driver");
bd.setUrl("jdbc:mysql://localhost:3306/mydb");
bd.setUsername("数据库名");
bd.setPassword("数据库密码");
//从连接池中获取一个连接对象
Connection connection = bd.getConnection();
//获取操作对象
PreparedStatement preparedStatement = connection.prepareStatement("select * from users");
ResultSet resultSet = preparedStatement.executeQuery();
//拿出数据库中的数据
while(resultSet.next()){
String string1 = resultSet.getString(1);
String string2 = resultSet.getString(2);
System.out.println(string1);
System.out.println(string2);
}
//释放资源
connection.close();
resultSet.close();
}
}
方式2:使用配置文件:
package org.westos.demo;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class MyTest {
public static void main(String[] args) throws Exception {
//导入数据库驱动jar包和两个DBCPjar包
//导入DBCP配置文件
//读取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("dbcp.properties"));
//创建连接池对象
DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
//从连接池中获取一个连接对象
Connection connection = ds.getConnection();
//之后的获取操作对象,拿出数据,释放资源就跟硬编码方式一样了
}
}
c3p0连接池
使用步骤:
(1)引入数据库驱动jar包和一个c3p0的jar包
(2)导入配置文件
注意:c3p0的配置文件名固定,必须是c3p0.properties且文件必须放在src目录下
(3)使用方式:
硬编码:
package org.westos.demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
public class MyTest {
public static void main(String[] args) throws Exception {
//引入数据库驱动jar包和一个c3p0的jar包
//硬编码
//创建c3p0连接池
ComboPooledDataSource pd = new ComboPooledDataSource();
//设置参数
pd.setDriverClass("com.mysql.jdbc.Driver");
pd.setJdbcUrl("jdbc:mysql:///mydb");
pd.setUser("数据库名");
pd.setPassword("数据库密码");
//从池中取出一个连接对象
Connection connection = pd.getConnection();
System.out.println(connection);
//之后的获取操作对象,拿出数据,释放资源就省略了,都是一样的
}
}
使用配置文件:
package org.westos.demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
public class MyTest {
public static void main(String[] args) throws Exception {
//引入数据库驱动jar包和一个c3p0的jar包
//导入配置文件
//创建连接池
ComboPooledDataSource pd = new ComboPooledDataSource();
//取出一个连接池对象
Connection connection = pd.getConnection();
System.out.println(connection);
//之后的获取操作对象,拿出数据,释放资源省略
}
}
DBCP和c3p0的区别: DBCP没有自动回收空闲连接的功能,而c3p0有
阿里德鲁伊Druid连接池
使用步骤:
(1)引入数据库驱动jar包和一个druid的jar包
(2)导入配置文件
(3)使用方式:
硬编码:
package org.westos.demo;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
public class MyTest {
public static void main(String[] args) throws Exception {
//引入数据库驱动jar包和一个druid的jar包
//创建连接池
DruidDataSource dd = new DruidDataSource();
//设置参数
dd.setDriverClassName("com.mysql.jdbc.Driver");
dd.setUrl("jdbc:mysql://localhost/mydb");
dd.setUsername("数据库名");
dd.setPassword("数据库密码");
//从池中取出一个连接对象
DruidPooledConnection connection = dd.getConnection();
//获取操作对象
//拿出数据
//释放资源
}
}
使用配置文件:
package org.westos.demo;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class MyTest {
public static void main(String[] args) throws Exception {
//引入数据库驱动jar包和一个druid的jar包
//导入配置文件
//创建连接池
Properties properties = new Properties();
properties.load(new FileInputStream("druid.properties"));
DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
//从池中取出一个连接对象
Connection connection = ds.getConnection();
System.out.println(connection);
//获取操作对象
//拿出数据
//释放资源
}
}
三种连接池都很常见,注意在使用的时候引入相应的jar包和导入对应的配置文件,而无论使用哪种连接池,数据库的驱动jar包都是必须要引入的。其中,最常见的是阿里德鲁伊Druid连接池
commons-dbutils工具类库
- 概述:该工具类库是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,它能够起到简化JDBC应用程序,同时也不会影响程序性能的作用
- 使用:
(1)引入druid连接池的jar包和工具jar包,导入druid配置文件
(2)代码演示:
package org.westos.demo;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.List;
import java.util.Properties;
public class MyTest {
public static void main(String[] args) throws Exception {
//引入jar包,导入配置文件
//创建连接池
Properties properties = new Properties();
properties.load(new FileInputStream("druid.properties"));
DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
//获取操作对象
QueryRunner runner = new QueryRunner(ds);
//使用DML语句
runner.update("insert into users value(?,?)", "zhangsan", "123456");
//使用DQL语句
//拿出数据库中指定的数据
User user = runner.query("select * from users where username=?", new BeanHandler<User>(User.class), "zhangsan");
System.out.println(user);
//拿出数据库中的所有数据
List<User> query = runner.query("select * from users", new BeanListHandler<User>(User.class));
//重写User类中的toString方法,输出结果
System.out.println(query);
}
}
结果:
可以看出,工具类库中直接有updete()和query()方法操作DML、DQL语句,且返回值直接就能拿到数据库里的内容,比JDBC简单了一些