通过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 数据源
Java数据库连接——JDBC调用存储过程,事务管理和高级应用
使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是啥?