JDBC数据库连接池的使用
一、基本概念和使用步骤
1.1、基本概念
概念:数据库连接池是一个存放数据库连接的容器,当系统初始化好后,容器被创建,容器中存储着一些数据库连接对象,当用户访问数据库
时,会从容器中获取一个数据库连接对象,当用户访问完后,释放连接,数据库连接对象会归还到容器中,而不是清除这个连接对象。
优点:节约资源,用户访问高效
JDBC依赖jar包:链接:/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.boPooledDataSource;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);}}