前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDBC:【第三篇:数据库数据库连接池 & JDBCTemplate】

JDBC:【第三篇:数据库数据库连接池 & JDBCTemplate】

作者头像
BWH_Steven
发布2019-08-09 15:38:18
1.6K0
发布2019-08-09 15:38:18
举报
文章被收录于专栏:理想二旬不止

数据库连接池 & JDBCTemplate

(一) 数据库连接池

每一个事物都有其存在的意义,在初学jdbc的时候,我们建立数据库连接对象后,会对其进行释放,但是数据库连接的建立和关闭是非常消耗资源的,而且频繁的操作会使得性能变得低下,数据库连接池可以帮我们解决这样的问题

(1) 概念

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

简单理解:就是一个存放数据库连接的容器,当用户需要访问数据库的时候,容器提供连接对象给用户用,之后用户将连接对象归还给容器

(2) 使用

A:实现 javax.sql 包下的 DataSource 接口

  • 方法:获取连接:getConnection()
  • 方法:归还连接:Connection.close()

注意:在连接池中使用connection.close()方法,不代表关闭连接,代表归还连接

B:我们可以使用一些开源的数据库厂商提供的实现

  • C3P0
  • Druid (来自阿里巴巴)
(3) C3P0

A:首先导入三个jar包 c3p0-0.9.5.2.jar 、mchange-commons-java-0.2.12.jar、数据库驱动jar包

B:修改配置文件

C创建数据库连接池对象——ComboPooledDataSource()

D获取连接——getConnection()

代码语言:javascript
复制
package cn.ideal.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo {

    private static DataSource comboPooledDataSource = null;

    static{
        //不指定则使用默认XML配置
        //数据库连接池对象 ComboPooledDataSource
        comboPooledDataSource = new ComboPooledDataSource();
    }

    public static Connection getConnection() throws SQLException {
        //获取连接
        return comboPooledDataSource.getConnection();
    }

    public static void main(String[] args) throws SQLException {
        System.out.println(getConnection());
    }
}

//测试输出日志及内容
(4) Druid
代码语言:javascript
复制
package cn.ideal.datasource.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);

        //获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);

        //获取连接
        Connection connection =ds.getConnection();

        System.out.println(connection);
    }
}

试着用Druid写一个工具类

代码语言:javascript
复制
package cn.ideal.datasource.utils;

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;

public class JDBCUtils {

    private static DataSource ds = null;

    static {
        //加载配置文件
        Properties properties = new Properties();
        try {
            properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 释放资源
     */

    public static void close(Statement statement, Connection connection) {
        close(null, statement, connection);
    }

    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

工具类测试

代码语言:javascript
复制
package cn.ideal.datasource.test;

import cn.ideal.datasource.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUtilsTest {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            //获取连接
            connection = JDBCUtils.getConnection();
            //定义sql
            String sql = "INSERT INTO account VALUES(NULL,?,?)";
            //获取preparedStatement对象
            preparedStatement = connection.prepareStatement(sql);
            //给?赋值
            preparedStatement.setString(1, "lisi");
            preparedStatement.setString(2, "2000");
            //执行sql
            int count = preparedStatement.executeUpdate();
            System.out.println(count);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(preparedStatement,connection);
        }
    }
}

(二) Spring JDBC

Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发

步骤: 1. 导入jar包 2. 创建JdbcTemplate对象,依赖于数据源DataSource JdbcTemplate template = new JdbcTemplate(ds);

3. 调用JdbcTemplate的方法来完成CRUD的操作

代码语言:javascript
复制
update():执行DML语句。增、删、改语句

queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
    注意:这个方法查询的结果集长度只能是1

queryForList():查询结果将结果集封装为list集合
    注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

query():查询结果,将结果封装为JavaBean对象
    query的参数:RowMapper
        一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
        new BeanPropertyRowMapper<类型>(类型.class)

queryForObject:查询结果,将结果封装为对象
    一般用于聚合函数的查询

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 理想二旬不止 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据库连接池 & JDBCTemplate
    • (一) 数据库连接池
      • (二) Spring JDBC
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档