如何在整个Java-MySQL应用程序中使用一个数据库连接对象?

如何在整个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()方法来获取与数据库的连接。在数据操作中使用获取的连接进行增删改查等操作,操作完毕后将连接对象返回连接池。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程