欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA使用C3P0操作数据库

程序员文章站 2024-03-20 08:45:28
...

先把结构图贴出来:
JAVA使用C3P0操作数据库

照抄,把文件全部建好,该导的包导了,如何导包参考这里
两个包:cn.itclass.jdbc.test,cn.itclass.jdbc.utils
三个类:TestC3P0.java,C3P0Utils.java,JDBCUtils.java
两个配置文件:c3p0-config.xml,db.properties

在实际项目中,我们会有很多用户来访问我们的数据库,如果每个人访问时我们都来创建一个数据库连接用完之后再关闭,将会造成大量的资源浪费和时间浪费,所以我们就采用一个叫连接池的东西来管理我们的连接,需要的时候从里面拿出来,用完之后再放回去,就可以解决上述的问题。我们可以自定义连接池,但是比较复杂,我们可以采用C3P0来帮我们完成想要的工作。

先写两个配置文件:c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///web08</property>
    <property name="user">root</property>
    <property name="password">123456</property>
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">20</property>
  </default-config>

  <named-config name="itclass"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///web08</property>
    <property name="user">root</property>
    <property name="password">123456</property>
  </named-config>
</c3p0-config>

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8
username=root
password=123456

因为连接池也是需要先创建连接,所以我们也需要用到JDBC创建连接的内容,接下来写JDBC创建连接的类:JDBCUtils.java

package cn.itclass.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import java.sql.Connection;
import java.sql.DriverManager;
import java.lang.Exception;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUtils {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    /**
     * 静态代码块,直接加载,速度更快 这里是创建并获取连接的步骤 并且需要一个名为db.properties:配置文件: 后缀固定,名字自取
     */
    static {

        try {
            // 1.通过当前类获取加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            // 2.通过类加载器的方法获得一个输入流
            InputStream is = classLoader.getResourceAsStream("db.properties");
            // 3.创建一个properties对象
            Properties props = new Properties();
            // 4.加载输入流
            props.load(is);
            // 5.获取相关参数的值
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            username = props.getProperty("username");
            password = props.getProperty("password");
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    /**
     * 这里还需要一个获取连接的方法
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }

    /**
     * 打开资源入口之后就要关闭 所以这里最后需要关闭资源
     */

    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

然后我们直接开始写C3P0的测试类:TestC3P0.java

package cn.itclass.jdbc.test;

import java.sql.Connection;

import java.sql.PreparedStatement;

import javax.sql.DataSource;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import cn.itclass.jdbc.utils.JDBCUtils;
@Test
    public void testAddUser() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        /*
         *  1.创建自定义连接池对象
         *  ComboPooledDataSource()如果括号内不填写内容,将查找config文件中默认的配置
         *  如果需要找自定义配置,需要写ComboPooledDataSource("XXX")
         */
        DataSource dataSource = new ComboPooledDataSource("itclass");

        try {
            // 2.从池子中获取链接
            conn = dataSource.getConnection();
            // 3.书写sql语句
            String sql = "insert into tbl_user values(null,?,?)";
            // 4.执行sql语句
            pstmt = conn.prepareStatement(sql);
            // 5.设置sql语句占位符的值
            pstmt.setString(1, "貂蝉2");
            pstmt.setString(2, "吕布2");
            // 6.对结果进行处理
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 7.关闭连接
            JDBCUtils.release(conn, pstmt, null);
        }
    }

有了以上代码之后,我们就可以直接使用了,但是我们可以发现,还可以将C3P0的1、2两步抽取出来,封装成一个工具类,所以我们将其封装成类:C3P0Utils.java

package cn.itclass.jdbc.utils;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itclass");

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }
    }
}

我们之后可以将TestC3P0.java代码进行更新,更新过后为以下内容:

package cn.itclass.jdbc.test;

import java.sql.Connection;

import java.sql.PreparedStatement;

import javax.sql.DataSource;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import cn.itclass.jdbc.utils.C3P0Utils;
import cn.itclass.jdbc.utils.JDBCUtils;


public class TestC3P0 {

    /**
     * 此方法为抽取工具类的方法
     */
    @Test
    public void testAddUser1() {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            // 2.从池子中获取链接
            conn = C3P0Utils.getConnection();
            String sql = "insert into tbl_user values(null,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "吕布1");
            pstmt.setString(2, "貂蝉1");
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils.release(conn, pstmt, null);
        }
    }

    @Test
    public void testAddUser() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        /*
         *  1.创建自定义连接池对象
         *  ComboPooledDataSource()如果括号内不填写内容,将查找config文件中默认的配置
         *  如果需要找自定义配置,需要写ComboPooledDataSource("XXX")
         */
        DataSource dataSource = new ComboPooledDataSource("itclass");

        try {
            // 2.从池子中获取链接
            conn = dataSource.getConnection();
            // 3.书写sql语句
            String sql = "insert into tbl_user values(null,?,?)";
            // 4.执行sql语句
            pstmt = conn.prepareStatement(sql);
            // 5.设置sql语句占位符的值
            pstmt.setString(1, "貂蝉2");
            pstmt.setString(2, "吕布2");
            // 6.对结果进行处理
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 7.关闭连接
            JDBCUtils.release(conn, pstmt, null);
        }
    }
}

为了看得更清楚一点,抽取之后的在上,没有抽取的在下,大家可以进行一下对比,虽然只少了两步,可如果程序很大的时候,就可能少很多代码了,所以这也是很至关重要的。

总结:连接池的使用和之前单一连接的方式差不多,为以下几步:
1)创建连接池(C3P0会根据配置文件创建出一定数量的连接,无需我们手动创建连接)
2)从连接池中获取连接
3)书写sql语句
4)执行sql语句
5)给占位符赋值
6)对结果集进行处理
7)关闭连接(这个地方还不太明白,应该是将其归还到连接池当中,但是却直接关闭了,后续了解之后再更新)

相关标签: C3P0