数据库连接池
- 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好以后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时从容器中获取连接对象,用户访问完之后将连接对象归还给容器。
- 好处:
- 节约资源。
- 用户访问高效。
- 实现:
- 标准接口:DataSource javax.sql包下的
- 方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法不会关闭连接,而是归还连接。
- 方法:
- 一般我们不去实现它,有数据库厂商来实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供
C3P0:数据库连接池技术
步骤
- 导入数据库驱动包
- 导入c3p0-0.9.5.2.jar包和mchange-commons-java-0.2.12.jar包
- 定义配置文件:
- 名称:c3p0.properties或者c3p0-config.xml
- 路径:直接放在src目录下即可
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接:getConnection
具体操作
创建c3p0-config.xml
<c3p0-config>
<!--使用默认的配置读取连接池对象-->
<default-config>
<!--连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3307/test?useSSL=false</property>
<property name="user">root</property>
<property name="password"> </property>
<!--连接池参数-->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!--连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3307/test?useSSL=false</property>
<property name="user">root</property>
<property name="password"> </property>
<!--连接池参数-->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
创建具体代码
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
1. c3p0的演示
*/
public class c3p3Dem01 {
public static void main(String[] args) throws SQLException {
//1.导入数据库驱动包
//2.导入c3p0相关两个包
//3.写配置文件
//4.创建数据库连接池对象
//获取默认的配置
DataSource ds=new ComboPooledDataSource();
//获取DataSource 使用指定的名称配置
//DataSource ds=new ComboPooledDataSource("otherc3p0");
//5.获取连接对象
Connection conn = ds.getConnection();
//将获取的连接对象打印
System.out.println(conn);
}
}
Druid:数据库连接池技术,由阿里巴巴提供
步骤
- 导入jar包
- 定义配置文件:
- 是properties形式的
- 可以是任意名称,可以放在任意目录下
- 加载配置文件 Properties
- 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
- 获取连接 getConnection
具体操作
编写配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3307/test?useSSL=false
username=root
password=
# 初始连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
测试代码
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* druid演示
*/
public class DruidDemo1 {
public static void main(String[] args) throws Exception {
//先导入数据库驱动包
//1.导包jar包
//2.定义配置文件
//3.加载配置文件
Properties pro=new Properties();
InputStream is=DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
//打印连接
System.out.println(conn);
}
}
定义工具类
- 定义一个JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取
- 释放资源
- 获取连接池的方法
编写配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3307/test?useSSL=false
username=root
password=
# 初始连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
编写工具类(先导入数据库驱动包和Druid的jar包)
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池工具类
*/
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource ds;
static {
try {
//1.加载配置文件
Properties pro=new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds=DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(Statement stmt, Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放资源
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//获取连接池方法
public static DataSource getDataSource(){
return ds;
}
}
编写测试类
import com.DW.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
使用工具类给表中添加一条数据
*/
public class DruidDemo2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql="insert into account values(null,?,?)";
//3.获取pstmt对象
pstmt=conn.prepareStatement(sql);
//4.给?赋值
pstmt.setString(1,"王五");
pstmt.setDouble(2,100);
//5.执行sql
int i = pstmt.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JDBCUtils.close(pstmt,conn);
}
}
}
spring JDBC
spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象来简化JDBC开发
步骤:
- 导入jar包
- 创建jdbcTemplate对象依赖于数据源DataSource(即数据库连接池对象)
- 调用JdbcTemplate的方法来完成数据库增删改查操作
- update():执行增、删、改语句
- queryForMap()查询结果将结果封装到map集合(将数据库列名作为key将值作为value封装为一个map所以查询结果集长度只能是1)
- queryForList()查询结果将结果封装到List集合(将每一个条结果装到map中然后将map放到list中)
- query()查询结果将结果封装到JavaBean对象
- queryForobject()查询结果将结果封装为对象
使用代码
/**
* JdbcTemplate入门
*/
import com.DW.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateDemo1 {
public static void main(String[] args) {
//1.导入jar包(还要导入数据库驱动包和连接池包)
//2.创建JdbcTemplate对象 传入一个DataSource(数据库连接池对象)
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
//3.调用方法
String sql="update account set bal=2000 where id=?";
int count = template.update(sql, 3);//后面参数为给sql赋值
System.out.println(count);
}
}