通过JDBC和DBCP连接数据库

Posted akyna-zh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JDBC和DBCP连接数据库相关的知识,希望对你有一定的参考价值。

该博客首先于我的个人博客https://akynazh.github.io中发布:
欢迎大家访问akynazh
不过由于dns污染,在国内需要科学上网才可以访问到哦。也可以考虑在hosts中修改被污染的dns。

JDBC

首先我们采用JDBC连接mysql数据库,用一个工具类JDBCUtils和一个对应的测试类UtilTest进行测试。

从Library导入Jar包:

mysql-connector-java-5.1

基本步骤如下:

  • 获取Properties配置文件中的连接信息
  • 获取数据库驱动
  • 进行数据库操作
  • 关闭资源

src/jdbc.properties

driver=com.mysql.jdbc.Driver
url=...
username=root
password=...

注:

下面对properties文件进行读取时,若是采用ResourceBundle,直接指定名称即可,而如果采用流的形式读取,则需要指定相对路径"src/jdbc.properties"。

src/com.web.java/jdbc/JDBCUtils.java

/**
 * author: jzh
 * JDBC工具类, 简化JDBC编程
 */
public class JDBCUtils {
    private static final ResourceBundle rsb;
    /**
     * 工具类中的构造方法都是私有的
     * 因为工具类当中的方法都是静态的,不需要new对象,直接采用类名调用
     */
    private JDBCUtils() {}

    // 静态代码块在类加载时执行,且只执行一次
    static {
        rsb = ResourceBundle.getBundle("jdbc");
        try {
            Class.forName(rsb.getString("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象
     * @return 返回Connection对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(rsb.getString("url"), rsb.getString("username"), rsb.getString("password"));
    }

    /**
     * 关闭资源
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

src/com.web.java/jdbc/UtilTest.java

进行一次模糊查询:第二个字母为A的人。

public class UtilTest {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT ename FROM emp WHERE ename LIKE ?";
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, "_A%");
            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("ename"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, conn);
        }
    }
}

控制台输出:

WARD
MARTIN
JAMES

DBCP

JDBC是Java程序连接数据库最基本的操作,它每次获取一个连接又丢弃一个连接,这样在面对频繁的,数量巨大的操作时,显然是吃不消的。所以我们需要数据库连接池来帮助我们处理过多的连接。

数据库连接池,提前指定最大数目的连接并放入池中,需要连接从中取得,操作完毕时将连接返回,此外,可以指定最大最小空闲数,最大活跃数,超时等待时间,等等。

数据库连接池又许多种,这里采用DBCP来进行操作,用一个工具类JDBCUtils_DBCP和一个对应的测试类DbcpTest进行测试。

从Library导入Jar包:

mysql-connector-java-5.1

commons-dbcp2-2.8.0

commons-pool2-2.10.0

commons-logging-1.2

基本步骤

  • 读取properties配置文件
  • 通过配置建立数据库连接池
  • 从数据库连接池获取连接
  • 进行数据库操作
  • 关闭资源

src/dbcp.properties

driver=com.mysql.jdbc.Driver
url=...
username=root
password=...

# 初始化连接数
initSize = 30
# 最大活跃数
maxActive = 50
# 最大空闲数
maxIdle = 20
# 最小空闲数
minIdle = 5
# 超时等待时间(毫秒)
maxWait = 60000

# 连接不使用后是否被回收
removeAbandonedOnMaintenance = true
removeAbandonedOnBorrow = true
# 连接在指定秒数未使用才会被删除(秒)
removeAbandonedTimeout = 100

注:

由于建立数据库连接池传入对象是一个properties对象,所以这里采用流的形式读取properties文件。另外有一个值得注意的地方是配置文件中username不能写成user…这是一个难以令人接受的事实!debug好久才发现了这个!估计是官方规定。。

src/com.web.java/dbcp/JDBCUtils_DBCP.java

/**
 * JDBC工具类,使用DBCP连接池
 * @Author Jzh
 */
public class JDBCUtils_DBCP {
    private static final Properties pro = new Properties();
    private static DataSource ds;

    // 加载dbcp配置文件
    static {
        try {
            pro.load(new FileInputStream("Java_7/src/dbcp.properties"));

        } catch (IOException e) {
            e.printStackTrace();
        }
        // 获取数据源对象
        try {
            ds = BasicDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private JDBCUtils_DBCP(){}

    /**
     * 从连接池中获取一个连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 关闭资源
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

src/com.web.java/dbcp/DbcpTest

同样进行一次模糊查询:第二个字母为A的人。

public class DbcpTest {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT ename FROM emp WHERE ename LIKE ?";
        try {
            conn = JDBCUtils_DBCP.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, "_A%");
            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("ename"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils_DBCP.close(rs, ps, conn);
        }
    }
}

控制台输出:

WARD
MARTIN
JAMES

author: jzh
date: 2021/7/27
转载需标明出处哦。

以上是关于通过JDBC和DBCP连接数据库的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 学习复习7 学习 Apache 开源DBCP 数据源

spring配置DBCP数据连接

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是啥?

javaWeb_JDBC_数据库连接池概述以及dbcp连接池

jdbc_dbcp连接池和装饰者模式概述