数据库连接池

本文详细介绍了在Maven项目中配置MySQL JDBC驱动并建立数据库连接的方法,包括在pom.xml中添加依赖,使用DriverManager获取Connection,以及PreparedStatement的使用。此外,还讲解了JDBC工具类的编写,包括静态变量、静态代码块、获取连接和关闭资源的方法。最后提到了数据库连接池的概念,以德鲁伊(Druid)为例展示了如何配置和使用连接池。
摘要由CSDN通过智能技术生成

首先在maven项目中如何取得和数据库(MySQL)的连接
jdbc驱动, 想要和MySQL连接必须要有jdbc的驱动jar包.

  1. 在pom.xml中配置jar包的坐标

    		<dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
                <scope>runtime</scope>
            </dependency>
    
  2. 连接代码

    //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //先获取连接对象
            Connection connection = DriverManager.getConnection("jdbc:mysql:///db_maven","root","root");
            //获取执行对象
            CallableStatement callableStatement = connection.prepareCall("select * from tb_item");
            //获取执行的结果对象
            ResultSet resultSet = callableStatement.executeQuery();
            //将结果集合转成list
            ArrayList<Item> list = new ArrayList<>();
            while (resultSet.next()){
                Item item = new Item();
                item.setId(resultSet.getString("id"));
                item.setName(resultSet.getString("name"));
                list.add(item);
            }
            //优化(使用完资源,记得回收掉)
            connection.close();
            callableStatement.close();
            resultSet.close();
            return list;
    

一.

jdbc: 本质上就是一套接口, 是由sun公司, 也就是官方定义的java语言操作所有关系型数据库的一套规范. 而具体的实现类是有各个数据库厂商自己写的, 称之为数据库驱动, 也就是jar包
我们程序员是只需要使用jdbc这套接口要编程, 但是真正执行的代码是驱动jar包.
这样一来, 我们并不需要管使用的是哪种关系型数据库, 连接数据库的代码是一样的.

二.

在这里插入图片描述
在这里插入图片描述

三.

  1. DriverManger
    在这里插入图片描述
    在这里插入图片描述

  2. 数据库连接对象Connection
    在这里插入图片描述

  3. sql语句的执行对象statement(静态)
    在这里插入图片描述

  4. 结果集对象resultSet
    在这里插入图片描述

  5. sql语句的执行对象Preparedstatement(动态)
    该 PreparedStatement 接口继承 Statement,并与之在两方面有所不同:

    PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

    由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

    作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。
    在这里插入图片描述
    在这里插入图片描述

jdbc工具类
写法
第一步
静态变量 : 配置文件的键
第二步
静态代码块 : 加载配置文件, 获取配置文件中键的值给静态变量
第三步
为使用时写get方法
第三步
为使用时写清除资源的方法

四. 数据库连接池

概念: 其实就是一个集合, 存放数据库连接的容器
当系统被初始化之后, 容器会申请一些连接对象, 用就来拿, 用完就还会容器
事实上, 官方也定义了一套接口, 也就是规范.
但是, 实际上我们并不使用官方的那一套
而是用一些第三方开发的规范(接口), 来实现这个连接池
(第三方的接口, 自然用的该第三方的实现类, 注意, 一般要导入两个jar包)

再来看maven项目中, 如何取得和数据库(MySQL)的连接的连接池对象
这里使用的是德鲁伊的第三方的连接池
在pom.xml中

	<dependency>
          <!--jdbc驱动-->
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.32</version>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <!--Druid连接池-->
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.0.9</version>
      </dependency>

工具类(没有使用配置文件的方式)

package com.itdong.utils;

import com.alibaba.druid.pool.DruidDataSource;
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.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
	1. 声明静态数据源成员变量
	2. 创建连接池对象
	3. 定义公有的得到数据源的方法
	4. 定义得到连接对象的方法
	5. 定义关闭资源的方法
 */
public class JDBCUtils {
    // 1.	声明静态数据源成员变量
    private static DruidDataSource ds;

    // 2. 创建连接池对象
    static {
        ds = new DruidDataSource();
        //这里设置池的各种属性配置, 可以使用配置文件,这样可以通过增加工具类的静态变量, 然后通过配置文件来获取以下这些配置的属性值, 后期可以通过只修改配置文件, 改变数据库连接池的配置, 而不用改代码. 
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql:///db_heimalvyou");
        ds.setUsername("root");
        ds.setPassword("root");
        ds.setInitialSize(5);
        ds.setMaxActive(10);
        ds.setMaxWait(3000);
    }

    // 3. 定义公有的得到数据源的方法
    public static DataSource getDataSource() {
        return ds;
    }

    // 4. 定义得到连接对象的方法
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    // 5.定义关闭资源的方法
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {}
        }

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

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

    // 6.重载关闭方法
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);
    }
}

工具类(使用配置文件的方式)

package com.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class JdbcUtils {
    private static DataSource ds;  //注意: 第三方的接口也是集成来自官方的数据连接池规范DataSource


    static {
        try {
            Properties pro = new Properties();
            InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            ds = DruidDataSourceFactory.createDataSource(pro);  //注意获取的是父类对象(也就是官方的规范), 如果静态变量定义的是DruidDataSource, 这里要强转
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static DataSource getDs(){
        return ds;
    }
    public static Connection getConnection() throws Exception{
        Connection connection = ds.getConnection();
        return connection;
    }
}

在这里插入图片描述
在这里插入图片描述
补充
在这里插入图片描述
也就是说
有了spring框架之后, 不用在去专门写获取执行sql语句的对象了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值