如何在整个Java-MySQL应用程序中使用一个数据库连接对象?
在Java应用程序中,经常需要连接数据库进行数据操作。而使用数据库连接池可以更好地管理和使用数据库连接对象,提高程序的性能和稳定性。
阅读更多:MySQL 教程
数据库连接池的概念
数据库连接池是一种提前创建好若干个数据库连接对象的集合,这些连接对象可以被程序重复利用。当应用需要连接数据库时,直接从连接池中获取一个连接对象,使用完毕后,将连接对象归还给连接池。
使用数据库连接池的好处包括:
- 减少数据库连接的创建和销毁,提高程序性能;
- 控制程序与数据库的连接数量,防止资源耗竭;
- 能够有效避免数据库连接泄露等问题。
使用Apache Commons DBCP连接池
在Java中,常用的连接池实现有Apache Commons DBCP、C3P0、JDBC Connection Pool等。我们这里介绍使用Apache Commons DBCP连接池。
步骤一:导入依赖
在项目pom.xml中导入Apache Commons DBCP依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
步骤二:配置连接池
在Java代码中配置连接池,并创建一个全局的数据库连接对象:
import org.apache.commons.dbcp2.BasicDataSource;
public class DBUtils {
private static BasicDataSource dataSource;
static {
dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/testDB");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setInitialSize(5); // 初始连接数
dataSource.setMaxTotal(20); // 最大连接数
}
public static BasicDataSource getDataSource() {
return dataSource;
}
// 创建全局的数据库连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
这里使用BasicDataSource类来配置连接池,可以设置连接池的初始大小、最大连接数等参数。在静态代码块中初始化BasicDataSource对象,并将其作为全局的连接池对象。
getConnection()方法用来获取与数据库的连接,该方法会从连接池中获取一个可用的连接对象。
步骤三:增删改查代码示例
在Java代码中使用连接池进行增删改查操作示例如下:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
// 查询操作
public List<User> query() {
Connection conn = null;
List<User> result = new ArrayList<>();
try {
conn = DBUtils.getConnection();
String sql = "select * from user";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
result.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
// 插入操作
public boolean insert(User user) {
Connection conn = null;
try {
conn = DBUtils.getConnection();
String sql = "insert into user(name, age) values (?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
int rows = ps.executeUpdate();
return rows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 更新操作
public boolean update(User user) {
Connection conn = null;
try {
conn = DBUtils.getConnection();
String sql = "update user set name=?, age=? where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.setInt(3, user.getId());
int rows = ps.executeUpdate();
return rows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 删除操作
public boolean delete(int id) {
Connection conn = null;
try {
conn = DBUtils.getConnection();
String sql = "delete from user where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
int rows = ps.executeUpdate();
return rows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
步骤四:测试
在测试代码中使用UserDao类中的方法来操作数据库:
public class Test {
public static void main(String[] args) {
UserDao dao = new UserDao();
// 查询数据
List<User> list = dao.query();
for (User user : list) {
System.out.println(user);
}
// 插入数据
User user = new User();
user.setName("Jack");
user.setAge(20);
dao.insert(user);
// 修改数据
user.setId(1);
user.setName("Tom");
dao.update(user);
// 删除数据
dao.delete(2);
}
}
结论
使用数据库连接池可以更好地管理和使用数据库连接对象,提高程序的性能和稳定性。
Apache Commons DBCP是一个常用的连接池实现,可以通过配置连接池参数来控制连接池的大小和连接池等属性。在Java应用程序中创建一个全局的数据库连接对象,通过getConnection()方法来获取与数据库的连接。在数据操作中使用获取的连接进行增删改查等操作,操作完毕后将连接对象返回连接池。