天天看点

JDBC数据库连接池的使用JDBC数据库连接池的使用

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);
    }
}