使用c3p0连接数据库实现增删改查

下面我将详细讲解使用c3p0连接数据库实现增删改查的完整攻略。

使用c3p0连接数据库

c3p0是一个开源的JDBC连接池库。它被大量应用于Java Web开发中,可以有效降低数据库的开销,优化系统的性能。下面介绍如何使用c3p0连接数据库。

步骤一:引入c3p0库

在Java工程的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>

步骤二:配置数据库连接信息

在项目中建立c3p0-config.xml文件,进行数据库连接池的配置:

<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>
<!-- 数据库的用户名和密码 -->
<property name="user">root</property>
<property name="password">root</property>
<!-- jdbc驱动类名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 初始化时获取连接的个数 -->
<property name="initialPoolSize">5</property>
<!-- 连接池中保留的最大连接数 -->
<property name="maxPoolSize">20</property>
<!-- 连接池中保留的最小连接数 -->
<property name="minPoolSize">2</property>
<!-- 当连接池中的连接用完时,客户端调用getConnection()后等待获取新连接的最长时间(以毫秒为单位),超时将抛出SQLException -->
<property name="checkoutTimeout">5000</property>
<!-- 每60秒检查所有连接池中的空闲连接,这个操作比较耗费性能,建议不要设置过频繁 -->
<property name="idleConnectionTestPeriod">60</property>

步骤三:使用连接池

在项目中建立DBUtil工具类,进行数据库连接池的使用:

public class DBUtil {
    /** 数据源 */
    private static ComboPooledDataSource dataSource;

    static {
        try {
            // 创建数据源
            dataSource = new ComboPooledDataSource();
            // 加载c3p0-config.xml,否则会使用默认值
            dataSource.setConfigFile("c3p0-config.xml");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取一个数据库连接
     * 
     * @return Connection
     */
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 释放连接
     * 
     * @param con
     */
    public static void releaseConnection(Connection con) {
        try {
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

以上步骤完成后,就可以使用DBUtil.getConnection()方法获取一个数据库连接,并进行增删改查操作了。

数据库操作

查询数据

使用c3p0连接池进行查询数据的代码示例:

public class UserDao {

    public List<User> queryAllUsers() throws SQLException {
        List<User> users = new ArrayList<>();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接
            con = DBUtil.getConnection();
            // SQL语句
            String sql = "SELECT id, name, age FROM user";
            // 预编译SQL
            ps = con.prepareStatement(sql);
            // 执行查询
            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"));
                users.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw e;
        } finally {
            // 释放连接
            DBUtil.releaseConnection(con);
            // 释放资源
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (con != null) {
                con.close();
            }
        }
        return users;
    }

}

插入数据

使用c3p0连接池进行插入数据的代码示例:

public class UserDao {

    public boolean addUser(User user) throws SQLException {
        boolean result = false;
        Connection con = null;
        PreparedStatement ps = null;
        try {
            // 获取数据库连接
            con = DBUtil.getConnection();
            // SQL语句
            String sql = "INSERT INTO user(name, age) VALUES (?, ?)";
            // 预编译SQL
            ps = con.prepareStatement(sql);
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            // 执行插入
            int count = ps.executeUpdate();
            if (count > 0) {
                result = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw e;
        } finally {
            // 释放连接
            DBUtil.releaseConnection(con);
            // 释放资源
            if (ps != null) {
                ps.close();
            }
            if (con != null) {
                con.close();
            }
        }
        return result;
    }

}

总结

以上就是使用c3p0连接数据库实现增删改查的完整攻略。需要注意的是,在使用连接池时,一定要正确释放数据库连接和相关资源,避免出现内存泄漏和数据库连接泄漏问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用c3p0连接数据库实现增删改查 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 通俗易懂的C++前缀和与差分算法图文示例详解

    通俗易懂的C++前缀和与差分算法图文示例详解 前言 前缀和与差分算法,是在算法中常用的技巧。在许多数据处理问题,通过利用前缀和和差分的方法,可以大大简化问题的复杂度和难度。因此,掌握这两种算法,是每一个学习算法的人必备的基本技能。 本篇文章将详细讲解前缀和与差分算法的基本原理与实现方法,通过简单易懂的图文示例,帮助读者更深入地理解算法的奥妙所在,并提供C++…

    C 2023年5月22日
    00
  • 联想拯救者笔记本开机蓝屏代码0xc000000d怎么办?

    “联想拯救者笔记本开机蓝屏代码0xc000000d”是一种常见的Windows操作系统蓝屏错误。这通常在连接USB驱动器或进行系统文件更改时发生。以下是解决此问题的完整攻略: 步骤一:重启电脑 第一步是重新启动您的电脑。有时,Windows操作系统遇到临时错误会导致蓝屏并且重启可以解决这个问题。这是一个非常简单的过程,只需点击“开始”菜单,然后点击“重新启动…

    C 2023年5月23日
    00
  • C 标准库 stdarg.h

    C 标准库 stdarg.h 是用于支持变参函数(Variadic functions)的头文件。它提供了实现此类函数的机制,能够让函数在编写时不需要定义参数的数量和类型。 1. va_arg va_arg 函数用于获取变参函数中指定类型的参数,每次获取一个参数,需要传入该参数类型的 Type,该函数会返回指定类型的值,并通过进一步操作来获取下一个参数值。 …

    C 2023年5月10日
    00
  • VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法

    让我来详细讲解一下“VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法”的完整攻略。 首先,错误码126是指模块无法找到,也就是说loadlibrary()函数无法找到需要加载的 DLL 文件。这种情况可能是因为 DLL 文件所需的其他 DLL 文件在系统路径之外,或者是缺少 DLL 文件所需的某些组件。解决这个问题的一种…

    C 2023年5月22日
    00
  • C++详细讲解继承与虚继承实现

    我们来详细讲解一下C++中继承与虚继承的实现。 继承概述 在C++中,继承是面向对象编程的三大特性之一,它是一种类与类之间的关系,表示一个类可以使用另一个类的属性和方法。 继承有许多优点,比如: 复用已有代码 在现有代码的基础上构建新的类 提高代码的可扩展性和可维护性 继承的实现 在C++中,继承可以通过public、protected和private三种方…

    C 2023年5月22日
    00
  • Vue渲染失败的几种原因及解决方案

    下面是“Vue渲染失败的几种原因及解决方案”的完整攻略。 1. 原因 1.1 HTML标签错误 在使用Vue渲染模板时,如果HTML标签结构错误,Vue可能会无法解析。常见的原因是HTML标签未闭合或嵌套顺序不正确。 1.2 数据类型不匹配 当Vue在渲染模板时,如果数据类型与模板中的期望不匹配,Vue也可能会渲染失败。例如,模板中期望传入一个字符串,但实际…

    C 2023年5月23日
    00
  • 现代配置YAML对比JSON优势分析

    简介 本文将从以下几个方面来详细讲解“现代配置YAML对比JSON优势分析”: YAML和JSON的区别和优势; YAML在实际使用中的示例。 YAML和JSON的区别和优势 YAML和JSON都是现代配置中常用的数据序列化格式。它们具有以下区别和优势: YAML优势 对象比JSON更易读; 支持注释,更加可读性、可维护性; 支持多种数据类型(除了数字和字符…

    C 2023年5月24日
    00
  • C语言超详细i讲解双向链表

    C语言超详细讲解双向链表 什么是双向链表 双向链表是一个动态数据结构,它由一系列的节点构成,每个节点分为三部分:数据域、指向前驱节点的指针和指向后继节点的指针。双向链表支持在任意位置插入或删除节点,与数组相比,它具有更好的灵活性和效率。 如何实现双向链表 定义节点 typedef struct DNode { int data; struct DNode* …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部