JDBC数据库连接池的使用
一、基本概念和使用步骤
1.1、基本概念
概念:数据库连接池是一个存放数据库连接的容器,当系统初始化好后,容器被创建,容器中存储着一些数据库连接对象,当用户访问数据库
时,会从容器中获取一个数据库连接对象,当用户访问完后,释放连接,数据库连接对象会归还到容器中,而不是清除这个连接对象。
优点:节约资源,用户访问高效
JDBC依赖jar包:链接:https://pan.baidu.com/s/15E_faXtcKH7qW8pQhxGj8g 提取码:3hnb
1.2、使用步骤
导入jar包步骤:
将jar包放在项目下一个文件夹中,然后右键–>Add as Library
1、导入mysql的jar包
本文使用的mysql的jar为mysql-connector-java-5.1.37-bin.jar
2、导入数据库连接池jar包
如果使用的是C3P0数据库连接池,需要导入c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
如果是使用druid数据库连接池,需要导入druid-1.0.9,jar
3、定义配置文件
如果使用C3P0数据库连接池,配置文件为c3p0-config.xml,注意该文件必须放在src文件夹下,并且只能使用该名称。
如果使用druid数据库连接池,配置文件为druid.properties,注意该文件可以使用任意名称和存放在任意位置,
但是一般存放在src文件夹下,并且使用druid命名。
4、创建数据库连接池对象
如果使用C3P0数据库连接池,则创建语句为:
DataSource DataSource对象名 = new ComboPooledDataSource();
如果使用druid数据库连接池,则创建语句为:
// 创建Properties对象
Properties Properties对象名 = new Properties();
// 创建druid配置文件的字节输入流对象
InputStream InputStream对象名 = 当前类名.class.getClassLoader().getResourceAsStream(druid配置文件路径);
// 导入配置文件
Properties对象名.load(InputStream对象名);
// 创建数据库连接池对象
DataSource DataSource对象名 = DruidDataSourceFactory.createDataSource(Properties对象名);
5、创建数据库连接对象
创建数据库连接对象语句:
// 创建数据库连接对象
Connection Connection对象名 = DataSource对象名.getConnection();
6、创建字符串类型的sql语句
7、创建Statement对象或者PreparedStatement对象
创建Statement对象语句:
// 创建Statement对象
Statement Statement对象名 = Connection对象名.createStatement();
创建PreparedStatement对象语句
// 创建PreparedStatement对象
PreparedStream PreparedStatement对象名 = Connection对象名.preparedStatement(sql语句)
8、执行sql语句
如果是Statement对象,则执行方法为:
// 执行增、删、改操作
Statement对象名.executeUpdate(sql语句);
// 执行查询操作
ResultSet ResultSet对象名 = Statement对象名.executeQuery(sql语句);
如果是PreparedStatement对象,则执行方法为:
// 调用setXxx方法将指定占位符(即?)处的内容补齐
PreparedStatement对象名.setXxx(int 占位符位置, Xxx 填充数据)
// 执行增、删、改操作
PreparedStatement对象名.executeUpdate();
// 执行查询操作
ResultSet ResultSet对象名 = PreparedStatement对象名.executeQuery();
9、执行释放资源操作
根据实际情况调用ResultSet对象、Statement、PreparedStatement对象、Connection对象的close方法释放资源。
二、C3P0数据库连接池
2.1、概念
C3P0数据库连接池是一种数据库连接池技术,里面包含大量对于数据库连接池的操作。
2.2、使用步骤
2.2.1、导入mysql的jar包
本文使用的mysql的jar为mysql-connector-java-5.1.37-bin.jar
2.2.2、导入C3P0的jar包
本文导入的是c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
2.2.3、创建C3P0的配置文件
C3P0的配置文件必须以c3p0.properties 或者 c3p0-config.xml命名,并且需要放在src目录下,否则会报错。
C3P0配置文件内容,以xml文件为例:
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<!-- 驱动 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 数据库连接url(根据自己实际情况进行配置) -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property>
<!-- 数据库登录用户名(根据自己实际情况填写) -->
<property name="user">root</property>
<!-- 数据库登录密码(根据自己实际情况填写) -->
<property name="password">root</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:3306/db2</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
2.2.4、创建数据库连接池对象
创建格式:DataSource DataSource对象名 = new ComboPooledDataSource();
创建示例:DataSource c3p0_ds = new ComboPooledDataSource();
2.2.5、创建Connection对象
创建格式:Connection Connection对象名 = DataSource对象名.getConnection();
创建示例:Connection c3p0_conn = c3p0_ds.getConnection();
2.2.6、创建需要执行的sql语句
2.2.7、创建Statement对象或者PreparedStatement对象
创建Statement对象格式:Statement Statement对象名 = Connection对象名.createStatement();
创建Statement对象示例:Statement c3p0_stat = c3p0_conn.createStatement();
创建PreparedStatement对象格式:PreparedStream PreparedStatement对象名 = Connection对象名.preparedStatement(sql语句)
创建PreparedStatement对象格式:PreparedStream c3p0_prep = c3p0_conn.preparedStatement(sql)
2.2.8、执行sql语句
如果是Statement对象,则执行方法为:
// 执行增、删、改操作
Statement对象名.executeUpdate(sql语句);
// 执行查询操作
ResultSet ResultSet对象名 = Statement对象名.executeQuery(sql语句);
如果是PreparedStatement对象,则执行方法为:
// 调用setXxx方法将指定占位符(即?)处的内容补齐
PreparedStatement对象名.setXxx(int 占位符位置, Xxx 填充数据)
// 执行增、删、改操作
PreparedStatement对象名.executeUpdate();
// 执行查询操作
ResultSet ResultSet对象名 = PreparedStatement对象名.executeQuery();
2.2.9、释放资源
根据实际情况调用ResultSet对象、Statement、PreparedStatement对象、Connection对象的close方法释放资源。
C3P0数据库连接池使用示例:
package jdbcconnectionpool.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 功能:练习C3P0数据库连接池的使用
*/
public class C3P0Demo01 {
public static void main(String[] args) {
// 1、创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
Connection conn = null;
Statement stat = null;
try {
// 2、获取数据库连接对象
conn = ds.getConnection();
// 获取Statement对象
stat = conn.createStatement();
// 创建一条sql语句
String insert_sql = "insert into dept values (50, '法律部', '上海')";
// 执行sql语句
int count = stat.executeUpdate(insert_sql);
// 输出执行结果
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 释放资源
if (stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
三、druid数据库连接池
3.1、概念
druid数据库连接池是一种数据库连接池技术,里面包含大量对于数据库连接池的操作。
3.2、使用方法
3.2.1、导入mysql的jar包
本文使用的mysql的jar为mysql-connector-java-5.1.37-bin.jar
3.2.2、导入druid的jar包
本文导入的是druid-1.0.9.jar
3.2.3、创建druid的配置文件
druid的配置文件配置文件为druid.properties,注意该文件可以使用任意名称和存放在任意位置,但是一般存放在src文件夹下,并且使用druid命名。
druid的配置文件内容:
// 数据库驱动
driverClassName=com.mysql.jdbc.Driver
// 数据库连接url(根据自己实际情况填写)
url=jdbc:mysql://127.0.0.1:3306/db3
// 数据库登录用户名(根据自己实际情况填写)
username=root
// 数据库登录密码(根据自己实际情况填写)
password=root
// 数据库连接池初始化连接数量(根据自己实际情况填写)
initialSize=5
// 数据库连接池允许的最大连接数量(根据自己实际情况填写)
maxActive=10
// 数据库连接运行的最大未响应时间(根据自己实际情况填写)
maxWait=3000
3.2.4、创建数据库连接池对象
创建格式:
// 创建Properties对象
Properties Properties对象名 = new Properties();
// 创建druid配置文件的字节输入流对象
InputStream InputStream对象名 = 当前类名.class.getClassLoader().getResourceAsStream(druid配置文件路径);
// 导入配置文件
Properties对象名.load(InputStream对象名);
// 创建数据库连接池对象
DataSource DataSource对象名 = DruidDataSourceFactory.createDataSource(Properties对象名);
创建示例:
// 加载配置文件
Properties druid_pro = new Properties();
InputStream druid_is = DruidDemo01.class.getClassLoader().getResourceAsStream(“druid.properties”);
druid_pro.load(druid_is);
// 创建数据库连接池对象
DataSource druid_ds = DruidDataSourceFactory.createDataSource(druid_pro);
3.2.5、创建Connection对象
创建格式:Connection Connection对象名 = DataSource对象名.getConnection();
创建示例:Connection c3p0_conn = c3p0_ds.getConnection();
3.2.6、创建需要执行的sql语句
3.2.7、创建Statement对象或者PreparedStatement对象
创建Statement对象格式:Statement Statement对象名 = Connection对象名.createStatement();
创建Statement对象示例:Statement c3p0_stat = c3p0_conn.createStatement();
创建PreparedStatement对象格式:PreparedStream PreparedStatement对象名 = Connection对象名.preparedStatement(sql语句)
创建PreparedStatement对象格式:PreparedStream c3p0_prep = c3p0_conn.preparedStatement(sql)
3.2.8、执行sql语句
如果是Statement对象,则执行方法为:
// 执行增、删、改操作
Statement对象名.executeUpdate(sql语句);
// 执行查询操作
ResultSet ResultSet对象名 = Statement对象名.executeQuery(sql语句);
如果是PreparedStatement对象,则执行方法为:
// 调用setXxx方法将指定占位符(即?)处的内容补齐
PreparedStatement对象名.setXxx(int 占位符位置, Xxx 填充数据)
// 执行增、删、改操作
PreparedStatement对象名.executeUpdate();
// 执行查询操作
ResultSet ResultSet对象名 = PreparedStatement对象名.executeQuery();
3.2.9、释放资源
根据实际情况调用ResultSet对象、Statement、PreparedStatement对象、Connection对象的close方法释放资源。
druid数据库连接池使用示例:
package jdbcconnectionpool.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Properties;
/**
* 功能:druid数据库连接池的基本使用
*/
public class DruidDemo01 {
public static void main(String[] args) throws Exception {
// 1、加载配置文件
Properties druid_pro = new Properties();
InputStream druid_is = DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties");
druid_pro.load(druid_is);
// 创建数据库连接池对象
DataSource druid_ds = DruidDataSourceFactory.createDataSource(druid_pro);
// 获取Connection对象
Connection druid_conn = druid_ds.getConnection();
// 获取Statement对象
Statement druid_stat = druid_conn.createStatement();
// 定义sql语句
String update_sql = "update dept set loc = '北京' where id = 50";
// 执行sql语句
int count = druid_stat.executeUpdate(update_sql);
// 输出处理结果
System.out.println("count = " + count);
// 释放资源
druid_stat.close();
druid_conn.close();
}
}
四、JdbcTemplate
4.1、概念
JdbcTemplate是Spring提供的一个关于JDBC的简易封装,用于简化JDBC的开发。
4.2、使用步骤
4.2.1、导入mysql的jar包
本文使用的mysql的jar为mysql-connector-java-5.1.37-bin.jar
4.2.2、导入数据库连接池jar包
如果使用的是C3P0数据库连接池,需要导入c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
如果是使用druid数据库连接池,需要导入druid-1.0.9,jar
4.2.3、导入JdbcTemplate需要的包
本文使用的JdbcTemplate包为:commons-logging-1.2.jar、spring-beans-5.0.0.RELEASE.jar、spring-core-5.0.0.RELEASE.jar、
spring-jdbc-5.0.0.RELEASE.jar、spring-tx-5.0.0.RELEASE.jar。
4.2.4、创建DataSource对象
如果使用C3P0数据库连接池,则创建语句为:
DataSource DataSource对象名 = new ComboPooledDataSource();
如果使用druid数据库连接池,则创建语句为:
// 创建Properties对象
Properties Properties对象名 = new Properties();
// 创建druid配置文件的字节输入流对象
InputStream InputStream对象名 = 当前类名.class.getClassLoader().getResourceAsStream(druid配置文件路径);
// 导入配置文件
Properties对象名.load(InputStream对象名);
// 创建数据库连接池对象
DataSource DataSource对象名 = DruidDataSourceFactory.createDataSource(Properties对象名);
4.2.5、创建JdbcTemplate对象
创建格式:JdbcTemplate 对象名 = new JdbcTemplate(DataSource对象名);
创建示例:JdbcTemplate jt = new JdbcTemplate(ds);
4.2.6、定义sql语句
sql语句示例:
// 查询所有数据并返回
String select_sql = “select * from dept”;
4.2.7、调用对应的方法执行sql语句
方法示例:
// 查询所有数据并将返回的结果封装到由dept对象组成的List集合中
List select_dept = jt.query(select_sql, new BeanPropertyRowMapper(Dept.class));
4.2.8、对返回的结果进行操作
操作示例:
// 输出List集合中的元素
for (Dept d: select_dept){
System.out.println(d.toString());
}
4.3、常用方法
4.3.1、创建JdbcTemplate对象
创建格式:JdbcTemplate 对象名 = new JdbcTemplate(DataSource对象名);
创建示例:JdbcTemplate jt = new JdbcTemplate(ds);
4.3.2、update()
功能:update():执行DML语句。增、删、改语句。
使用格式:int count = JdbcTemplate.update(String sql, args a);
参数:
String sql:需要执行的DML语句,即增、删、改语句。
args a:占位符数据,即?处填充的数据,有几个?写几个数据。
返回值:
int count:数据库中受影响的数据行数。
使用示例:
// 定义Sql语句
String update_sql = “update dept set loc=? where id=?”;
// 执行sql语句
int count = jt.update(update_sql, loc, id);
4.3.3、queryForMap()
功能:查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合。
使用格式:Map<String, Object> 变量名 = JdbcTemplate对象名.queryForMap(String sql, args a)
参数:
String sql:需要执行的DQL语句,即查询语句。
args a:占位符数据,即?处填充的数据,有几个?写几个数据。
返回值:
Map<String, Object> 变量名:查询结果。
使用示例:
// 定义Sql语句
String select_sql = “select * from dept where id = ?”;
// 执行sql语句
Map<String, Object> select_map = jt.queryForMap(select_sql, id);
注意:这个方法查询的结果集长度只能是1,用于查询结果为1行多列的情况。
4.3.4、queryForList()
功能:查询结果将结果集封装为list集合。
使用格式:List<Map<String, Object>> 变量名 = JdbcTemplate对象名.queryForList(String sql, args a)
参数:
String sql:需要执行的DQL语句,即查询语句。
args a:占位符数据,即?处填充的数据,有几个?写几个数据。
返回值:
List<Map<String, Object>> 变量名:查询结果。
使用示例:
// 定义Sql语句
String select_sql = “select * from dept”;
// 执行sql语句
List<Map<String, Object>> select_list = jt.queryForList(select_sql);
注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中,用于查询结果为多行一列或者多行多列的情况。
4.3.5、query()
功能:查询结果,将结果封装为由JavaBean对象组成的List集合,JavaBean对象值自己定义的类对象,属性为返回结果的列名。
使用格式:List<类名> 变量名 = JdbcTemplate对象名.query(String sql, new BeanPropertyRowMapper<类名>(类名.class))
参数:
String sql:需要执行的DQL语句,即查询语句。
new BeanPropertyRowMapper<类名>(类名.class):RowMapper接口的实现类,用于确定一行数据填充格式。
返回值:
List<类名> 变量名:查询结果,为以类对象为数据的List集合。
使用示例:
// 定义Sql语句
String select_sql = “select * from dept”;
// 执行sql语句
List select_dept = jt.query(select_sql, new BeanPropertyRowMapper(Dept.class));
注意:
new BeanPropertyRowMapper<类名>(类名.class)可以替换为RowMapper接口,然后自己实现一行数据填充格式。
query多用于查询多行多列或者多行一列的数据。
4.3.6、queryForObject()
功能:查询结果,将结果封装为对象
使用格式:数据类型 变量名 = JdbcTemplate对象名.queryForObject(String sql, 数据类型封装类.class)
参数:
String sql:需要执行的DQL语句,即查询语句。
数据类型封装类.class:查询结果的数据类型的封装类的class文件。
数据类型 变量名:查询结果,数据类型与查询结果数据类型相同。
使用示例:
// 定义Sql语句
String select_sql = “select count(id) from dept”;
// 执行sql语句
long count = jt.queryForObject(select_sql, Long.class);
注意:queryForObject方法一般用于聚合函数的查询,并且查询结果为但个数据的值,即一行一列的数据。
JdbcTemplate使用示例:
package jdbcconnectionpool.jdbctemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import util.DruidUtils;
/**
* 功能:练习JDBCTemplate的使用
*/
public class JDBCTemplateDemo01 {
public static void main(String[] args) {
// 1、加载配置文件
Properties druid_pro = new Properties();
InputStream druid_is = DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties");
druid_pro.load(druid_is);
// 创建数据库连接池对象
DataSource druid_ds = DruidDataSourceFactory.createDataSource(druid_pro);
// 创建JDBCTemplate对象
JdbcTemplate jt = new JdbcTemplate(druid_ds);
// 定义需要执行的sql语句
String update_sql = "update dept set loc = '北京' where id = ?";
// 执行sql语句
int count = jt.update(update_sql, 40);
// 输出sql语句执行结果
System.out.println(count);
}
}