数据库连接池(C3P0,Druid)、Spring JDBC的基本使用(二)

Content:

  • 数据库连接池
    • C3P0:数据库连接池技术
    • Druid:数据库连接池实现技术,由阿里巴巴提供的
  • Spring JDBC : JDBC Template


概念:

1)DBCP
  DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
2)c3p0
  c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
3)Druid
  阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
4)Spring JDBC : JDBC Template链接: 原理.
  Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
  JDBC已经能够满足大部分用户最基本的对数据库的需求,但是在使用JDBC时,应用必须自己来管理数据库资源。Spring对数据库操作需求提供了很好的支持,并在原始JDBC基础上,构建了一个抽象层,提供了许多使用JDBC的模板和驱动模块,为Spring应用操作关系数据库提供了更大的便利。

(一)C3p0连接池:

 * 使用步骤:
        1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
            * 不要忘记导入数据库驱动jar包
        2. 定义配置文件:
            * 名称: c3p0.properties 或者 c3p0-config.xml
            * 路径:直接将文件放在src目录下即可。

        3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
        4. 获取连接: getConnection
   * 代码:
         //1.创建数据库连接池对象
        DataSource ds  = new ComboPooledDataSource();
        //2. 获取连接对象
        Connection conn = ds.getConnection();
  • 实现demo:
/**
 * @author 
 * @date 2019-12-31 17:18
 * @fun C3p0连接池使用步骤:
 *      1.导入两个c3p0包和一个MySQL驱动包,并添加依赖
 *      2.定义配置文件
 *      3.创建连接池对象
 *      4.获取连接对象
 */
public class C3p0 {
    public static void main(String[] args) throws SQLException {
        //1.创建数据库连接池对象
        ComboPooledDataSource ds = new ComboPooledDataSource();
        //2.获取连接对象
        Connection con = ds.getConnection();
        //3.打印
        System.out.println(con);
    }
}

程序结构


(二)Druid 连接池:

demo1:打印连接对象con
/**
 * @author cw
 * @date 2020-01-02 08:58
 * @fun :打印连接
 * 		1. 导入jar包 druid-1.0.9.jar
        2. 定义配置文件:
                * 是properties形式的
                * 可以叫任意名称,可以放在任意目录下
        3. 加载配置文件。Properties
        4. 获取数据库连接池对象:通过工厂来来获取  DruidDataSourceFactory
        5. 获取连接:getConnection
 */


public class Druid {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties pro = new Properties();
        InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        //获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //获取连接
        Connection con = ds.getConnection();
        //打印连接
        System.out.println(con);
    }
}

demo2:使用工具类,druid连接池,给数据库db3,中的account表添加一条记录

  • 实现思路:

    1. 步骤:
      1. 导入jar包 druid-1.0.9.jar
      2. 定义配置文件:
      * 是properties形式的
      * 可以叫任意名称,可以放在任意目录下
      3. 加载配置文件。Properties
      4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
      5. 获取连接:getConnection
      • 代码:
        //3.加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream(“druid.properties”);
        pro.load(is);
        //4.获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //5.获取连接
        Connection conn = ds.getConnection();
    2. 定义工具类
      1. 定义一个类 JDBCUtils
      2. 提供静态代码块加载配置文件,初始化连接池对象
      3. 提供方法
        1. 获取连接方法:通过数据库连接池获取连接
        2. 释放资源
        3. 获取连接池的方法

  • 1、入口:DruidDemo2

/**
 * @author 
 * @date 2020-01-02 10:06
 * 使用新的工具类
 */
public class DruidDemo2 {
    public static void main(String[] args) {
        /*
         *使用工具类,给数据库db3,中的account表添加一条记录
         */
        Connection con = null;
        PreparedStatement pstmt = null;

        try {
            //1.获取连接
            con = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "insert into account values(null,?,?)";
            //3.获取pstmt对象,执行sql
            pstmt = con.prepareStatement(sql);
            //4.给?赋值
            pstmt.setString(1,"xiaoming");
            pstmt.setDouble(2,5000);
            //5.执行sql插入语句
            int i = pstmt.executeUpdate();
            System.out.println(i);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //6.释放资源
            JDBCUtils.close(pstmt,con);
        }
    }
}

  • 2.工具类:JDBCUtils
/**
 * @author 
 * @date 2020-01-02 09:21
 * @fun 工具类
 *  1. 定义一个类 JDBCUtils
    2. 提供静态代码块加载配置文件,初始化连接池对象
    3. 提供方法
        1. 获取连接方法:通过数据库连接池获取连接
        2. 释放资源
        3. 获取连接池的方法
 */
public class JDBCUtils {
    // 定义成员变量:连接池对象ds
    private static DataSource ds;
    static {

        try {
            //加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //通过工厂创建连接池对象ds
            ds = DruidDataSourceFactory.createDataSource(pro);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    /**
     * 关闭资源
     * @return
    */
    public static void close(Statement stat, Connection con){
        close(null,stat,con);
    }

    //方法重载
    public static void close(ResultSet rs, Statement stat,Connection con){
        if (rs != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 获取连接池的方法
     * @return
    */
    public static DataSource getDataSource(){
        return ds;
    }

}

  • 3、通过配置文件的方式,读取相关信息:
    druid.properties(文件名称可自定义,放置路径为本项目任意位置)
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db3
username=root
password=root
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
#最大等待时间
maxWait=3000



(三)Spring JDBC

  • Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发操作步骤:
  • 步骤:
    1. 导入jar包
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
        * JdbcTemplate template = new JdbcTemplate(ds);

    3. 调用JdbcTemplate的方法来完成CRUD的操作
        * update():执行DML语句。增、删、改语句
        * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
            * 注意:这个方法查询的结果集长度只能是1
        * queryForList():查询结果将结果集封装为list集合
            * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
        * query():查询结果,将结果封装为JavaBean对象
            * query的参数:RowMapper
                * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
                * new BeanPropertyRowMapper<类型>(类型.class)
        * queryForObject:查询结果,将结果封装为对象
            * 一般用于聚合函数的查询

快速实现:

/**
 * @author 
 * @date 2020-01-02 11:06
 * JdbcTemplate入门(springframework)
 */
public class JdbcTemplateDemo1 {
    public static void main(String[] args) {
        //1.导5个包
        //2.创建JdbcTemplate 的对象,依赖数据源dataSourse
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());  
        //JDBCUtils.getDataSource()上面实现的工具类,传递ds数据库连接池资源
        //3.调用JdbcTemplate的方法来完成CRUD的操作
        String sql = "update account set balance = 20000 where id  = ?";
        int i = template.update(sql, 5);
        System.out.println(i);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是常用数据库连接池的配置说明: 1. DBCP(Apache Commons DBCP) DBCP 是 Apache 的 Jakarta 项目中的一个子项目,是一个开源的数据库连接池实现。 配置说明: 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> ``` 在 Spring 的配置文件中配置数据库连接池: ```xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${driverClassName}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="initialSize" value="${initialSize}"/> <property name="maxActive" value="${maxActive}"/> <property name="maxIdle" value="${maxIdle}"/> <property name="minIdle" value="${minIdle}"/> <property name="maxWait" value="${maxWait}"/> <property name="validationQuery" value="${validationQuery}"/> <property name="testOnBorrow" value="${testOnBorrow}"/> <property name="testOnReturn" value="${testOnReturn}"/> <property name="testWhileIdle" value="${testWhileIdle}"/> </bean> ``` 其中,${} 中的内容需要根据实际情况进行替换。 2. c3p0 c3p0 是一个开源的 JDBC 数据库连接池,可以更好地管理 JDBC 连接。 配置说明: 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> ``` 在 Spring 的配置文件中配置数据库连接池: ```xml <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClassName}" /> <property name="jdbcUrl" value="${jdbcUrl}" /> <property name="user" value="${username}" /> <property name="password" value="${password}" /> <property name="initialPoolSize" value="${initialPoolSize}" /> <property name="minPoolSize" value="${minPoolSize}" /> <property name="maxPoolSize" value="${maxPoolSize}" /> <property name="acquireIncrement" value="${acquireIncrement}" /> <property name="acquireRetryAttempts" value="${acquireRetryAttempts}" /> <property name="acquireRetryDelay" value="${acquireRetryDelay}" /> <property name="autoCommitOnClose" value="${autoCommitOnClose}" /> <property name="checkoutTimeout" value="${checkoutTimeout}" /> <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}" /> <property name="maxIdleTime" value="${maxIdleTime}" /> <property name="maxStatements" value="${maxStatements}" /> <property name="numHelperThreads" value="${numHelperThreads}" /> <property name="preferredTestQuery" value="${preferredTestQuery}" /> <property name="testConnectionOnCheckin" value="${testConnectionOnCheckin}" /> <property name="testConnectionOnCheckout" value="${testConnectionOnCheckout}" /> <property name="unreturnedConnectionTimeout" value="${unreturnedConnectionTimeout}" /> <property name="debugUnreturnedConnectionStackTraces" value="${debugUnreturnedConnectionStackTraces}" /> </bean> ``` 其中,${} 中的内容需要根据实际情况进行替换。 3. Druid Druid 是一个高效的数据库连接池,由阿里巴巴开发并开源。 配置说明: 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> ``` 在 Spring 的配置文件中配置数据库连接池: ```xml <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${driverClassName}" /> <property name="url" value="${jdbcUrl}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="initialSize" value="${initialSize}" /> <property name="maxActive" value="${maxActive}" /> <property name="minIdle" value="${minIdle}" /> <property name="maxWait" value="${maxWait}" /> <property name="poolPreparedStatements" value="${poolPreparedStatements}" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="${maxPoolPreparedStatementPerConnectionSize}" /> <property name="validationQuery" value="${validationQuery}" /> <property name="testOnBorrow" value="${testOnBorrow}" /> <property name="testOnReturn" value="${testOnReturn}" /> <property name="testWhileIdle" value="${testWhileIdle}" /> <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" /> <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" /> <property name="filters" value="${filters}" /> </bean> ``` 其中,${} 中的内容需要根据实际情况进行替换。同时,Druid 还提供了很多其他的配置项,可以根据需要进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值