数据库连接池 —— Druid的简单使用

2019/04/10 10:10
阅读数 14

Druid不仅是一个数据库连接池,还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。

 

使用步骤

一定要导入jar架包。要配置好文件,如果不配置文件,记得在程序中自行添加。

 

  1. 导入jar包: druid-1.0.9.jar、mysql-connector-java-5.1.48.jar

  2. 定义配置文件:可以命名为druid-1.0.9.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://MySQL地址/数据库名
    username=用户名
    password=密码
    initialSize=初始化连接数
    maxActive=最大连接数
    maxWait=最大等待时间(毫秒为单位)

     

  3. 加载配置文件druid-1.0.9.properties

  4. 获取连接池对象

  5. 获取数据库连接

举例如下:

package my.view.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 properties = new Properties();

        // 获取类的类加载器
        ClassLoader classLoader = DruidDemo.class.getClassLoader();

        // 获取druid-1.0.9.properties配置文件资源输入流
        InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");

        // 加载配置文件
        properties.load(resourceAsStream);

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

        // 获取数据库连接对象
        Connection connection = dataSource.getConnection();

        // 打印获取到的数据库连接对象地址值
        System.out.println(connection);
    }

}

 

定义一个创建数据库连接池对象的类

在使用数据库连接池的时候,我们不可能说每次都如上例中的情况自己写一遍吧。我们可以自定义一个工具类,用来创建数据库连接池对象,这个时候,我们乳沟想要创建数据库连接池对象,直接调用该工具类即可。

 

创建工具类实例

定义获取数据库连接池对象的方法

/**
 * 数据库连接对象
 */
private static DataSource dataSource;

/*
 获取数据库连接池对象
 */
static {

    try {
        // 获取加载配置文件的对象
        Properties properties = new Properties();
        // 获取类的类加载器
        ClassLoader classLoader = JdbcUtils.class.getClassLoader();
        // 获取druid-1.0.9.properties配置文件资源输入流
        InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");
        // 加载配置文件
        properties.load(resourceAsStream);
        // 获取连接池对象
        dataSource = DruidDataSourceFactory.createDataSource(properties);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

/**
 * 获取连接池对象
 */
public static DataSource getDataSource() {
    return dataSource;
}

 

定义获取数据库连接对象的方法

/**
 * 获取数据库连接对象
 */
public static Connection getConnection() throws Exception {
    return dataSource.getConnection();
}

 

定义释放资源的方法

/**
 * 归还连接
 * @param t 要被归还到熟即可连接池对象的数据库连接对象
 * @param <T> 数据库连接对象的类型
 */
public static <T> void releaseResources (T t){
    if(t != null){
        try {
            // 利用反射,获取class对象
            Class<?> aClass = t.getClass();
            // 获取class对象中的方法对象
            Method close = aClass.getMethod("close");
            // 执行方法
            close.invoke(t);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

该工具类总的代码:

package my.view.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class JdbcUtils {

    /**
     * 数据库连接对象
     */
    private static DataSource dataSource;

    /*
     获取数据库连接池对象
     */
    static {

        try {
            // 获取加载配置文件的对象
            Properties properties = new Properties();
            // 获取类的类加载器
            ClassLoader classLoader = JdbcUtils.class.getClassLoader();
            // 获取druid-1.0.9.properties配置文件资源输入流
            InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");
            // 加载配置文件
            properties.load(resourceAsStream);
            // 获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取连接池对象
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 获取数据库连接对象
     */
    public static Connection getConnection() throws Exception {
        return dataSource.getConnection();
    }

    /**
     * 归还连接
     * @param t 要被归还到熟即可连接池对象的数据库连接对象
     * @param <T> 数据库连接对象的类型
     */
    public static <T> void releaseResources (T t){
        if(t != null){
            try {
                // 利用反射,获取class对象
                Class<?> aClass = t.getClass();
                // 获取class对象中的方法对象
                Method close = aClass.getMethod("close");
                // 执行方法
                close.invoke(t);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

 

使用上面创建个工具类实例

有如下一个数据表格

CREATE TABLE account (
    id INT PRIMARY KEY AUTO_INCREMENT,   -- id
    NAME VARCHAR(10),                    -- 名字
    balance DOUBLE                       -- 余额
);

INSERT INTO account (NAME, balance) VALUES ('LeeHua', 1000), ('Tom', 1000);

向该表格中插入一条数据,实现如下:

package my.view.datasource.druid;

import my.view.utils.JdbcUtils;

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

public class JdbcUtilsDemo {

    public static void main(String[] args) throws Exception{

        // 获取数据库连接池对象
        DataSource dataSource = JdbcUtils.getDataSource();

        // 从数据库连接池对象中获取数据库连接对象
        Connection connection = dataSource.getConnection();

        // 预定义定义SQL语句
        String sql = "INSERT INTO account (NAME, balance) VALUES (?, ?);";

        // 获取执行预定义SQL语句对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        // 给?赋值
        preparedStatement.setString(1, "WanWu");
        preparedStatement.setInt(2, 2000);

        // 执行预编译好的SQL语句
        preparedStatement.executeUpdate();

        // 释放资源:PreparedStatement
        JdbcUtils.releaseResources(preparedStatement);

        // 归还连接
        JdbcUtils.releaseResources(connection);

        // 释放资源:数据库连接池
        JdbcUtils.releaseResources(dataSource);
    }

}

 

运行程序,然后查询一下表记录:

可以看到插入了一条数据,说明测试成功。

 

          

 

原文出处:https://www.cnblogs.com/liyihua/p/12329228.html

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部