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

yizhihongxing

下面我将详细讲解使用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 2023年5月30日
    00
  • Python2.x与3​​.x版本有哪些区别

    Python2.x与3.x版本有哪些区别 Python2.x与3.x版本在语法上的区别 Python 3.x版本在语法上与Python 2.x版本相比有以下区别: 1. print语句 在Python 2.x版本中,print是语句,可以直接输出内容,语法如下: # Python 2.x print "hello world" 而在Pyt…

    C 2023年5月22日
    00
  • 使用MinGW使Windows通过gcc实现C或C++程序本地编译执行的方法

    使用MinGW使Windows通过gcc实现C或C++程序本地编译执行的方法包括以下步骤: 安装MinGW 确认Windows系统位数(32位或64位) 下载MinGW安装程序并安装:https://osdn.net/projects/mingw/releases/ 安装时务必勾选“mingw32-base”、“mingw32-gcc-g++”这两个选项 配…

    C 2023年5月23日
    00
  • C语言中时间戳转换成时间字符串的方法

    将C语言中的时间戳转换成时间字符串,需要用到几个相关的C库函数。下面是操作步骤和示例代码。 时间戳 首先简单介绍一下时间戳。时间戳是指从1970年1月1日00:00:00到指定时间的总秒数。在C语言中可以用time()函数获取当前时刻的时间戳,返回值是一个time_t类型的整数。 localtime()函数 在将时间戳转换成时间字符串的过程中,需要用到loc…

    C 2023年5月22日
    00
  • mac外接显示器没反应怎么办? mac外接显示器无信号原因分析

    Mac外接显示器没反应怎么办? 问题描述 当我们在使用Mac电脑的时候,有时需要将其接入到外接显示器上进行扩展,这样可以提高工作效率,但是有时会遇到显示器无法正常显示出图像的情况,以下就对这个问题进行分析解决。 解决步骤 步骤一:检查连接线 第一步要检查的是连接线是否正确连接。通常外接显示器使用的是HDMI、DVI或者VGA接口,所以需要确保连接线与显示器接…

    C 2023年5月24日
    00
  • win10应用程序中出现异常未知软件异常(0xe06d7363)的错误代码怎么办

    解决”win10应用程序中出现异常未知软件异常(0xe06d7363)的错误代码”这一问题的完整攻略如下: 1. 确认问题 第一步是确认问题。如果你的Windows 10系统中的应用程序出现了这个错误代码,那么这通常是由于某个应用程序组件出现了问题而导致的。这很可能是由于文件系统上的某种故障或应用程序使用的一些组件出现了问题而导致的。因此,首先要做的是确定哪…

    C 2023年5月23日
    00
  • C++中构造函数与析构函数的调用顺序详解

    当我们使用C++来编写程序时,构造函数和析构函数是非常重要的。了解它们的调用顺序是编写高质量代码的关键之一。本攻略将针对C++中构造函数和析构函数的调用顺序进行详细讲解。 构造函数和析构函数 在了解构造函数和析构函数的调用顺序之前,我们需要先了解它们的作用和定义。在C++中,构造函数用于在创建对象时初始化对象的成员变量,而析构函数则在对象生命周期结束时释放资…

    C 2023年5月22日
    00
  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 在C语言中,atoi函数能将字符串转化为整型数。本文将详细讲解C语言中模拟实现atoi函数的过程以及示例。 需求分析 想要实现atoi函数,我们需要明确要求的功能。即,将字符串转化为整型数。 实现思路 以下是实现atoi函数的思路: 首先考虑如何将字符转化为数字。C语言中,字符变量按照ASCII码表存储,因此可以通过in…

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