JavaWeb对于C3P0链接池的CURD实例原理详解

时间:2022-10-19 11:56:32

一. java对于C3P0链接池的详解

1.1 C3P0是什么?

c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。

JavaWeb对于C3P0链接池的CURD实例原理详解

1.2 C3P0工作原理

开源JDBC连接池C3P0连接池在程序操作数据库之前根据配置文件创建一定数量的连接。当线程需要时,它会直接删除连接,从而缩短创建连接的时间。使用连接时,它会释放连接并将其放回连接池。如果连接池中的连接用完,程序将根据配置文件中配置的数据创建另一批,并在使用后将其放回连接池中,关闭连接是不正确的。

1.3 C3P0的特点

1.资源的高效利用

2.更快的系统反应速度

3.减少了资源独占的风险

4.统一的连接管理,避免数据库连接泄露

5.C3P0有自动回收空闲连接功能

二.C3P0简单Demo

实验名称:数据库连接池与DBUtils工具。

实验要求:掌握数据库连接池与DBUtils工具的使用方法。

依赖的包:

JavaWeb对于C3P0链接池的CURD实例原理详解

  1. c3p0-0.9.5.2.jar
  2. mchange-commons-java-0.2.15.jar
  3. mysql-connector-java-8.0.11.jar

1.新建c3p0-config.xml文件,这个是简单的配置。

在src根目录下创建一个c3p0-config.xml文件,用于设置数据库的连接信息和数据源的初始化信息。

注意,在标准的meaven项目中,c3p0-config.xml一个新建在resources文件夹下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/school_work?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
		<property name="user">root</property>
		<property name="password">123456</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">10</property>
		<property name="maxPoolSize">20</property>
	</default-config>
</c3p0-config>

2.在项目的src目录下,创建一个名为utils的包,然后在该包下创建C3p0Utils类,该类用于创建数据源。

private static DataSource ds;
static {
    ds = new ComboPooledDataSource();
}
public static DataSource getDataSource() {
    return ds;
}

3.创建Curriculum实体类,作用于封装该对象:

private int id;
private String curriculumName;
private double price;
private String introduction;

数据库如下:

JavaWeb对于C3P0链接池的CURD实例原理详解

4.创建DBUtilsDao类;

在项目的src目录下,然后在该包下创建一个DBUtilsDao类,该类实现了对user表增删改查的基本操作。

  • 查询所有,返回List集合,创建QueryRunner对象,写SQL语句
public List findAll() throws SQLException {
    QueryRunner runner =new QueryRunner(C3p0Utils.getDataSource());
    String sql ="select * from curriculum";
    List list =(List) runner.query(sql,
            new BeanListHandler(Curriculum.class));
    return list;
}
  • 查询单个,返回对象。创建QueryRunner对象,写SQL语句。
    public Curriculum find(int id) throws  SQLException{
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        String sql ="select * from curriculum where id=?";
        Curriculum curriculum =(Curriculum) runner.query(sql,
                new BeanHandler(Curriculum.class),new Object[] {id});
        return curriculum;
    }
  • 添加用户的操作,创建QueryRunner,写SQL语句。

    public Boolean insert(Curriculum curriculum) throws SQLException{
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        String sql = "insert into curriculum (id,curriculumName,price,introduction) values (?,?,?,?)";
        int num =runner.update(sql, new Object[] {curriculum.getId(), curriculum.getCurriculumName(), curriculum.getPrice(),curriculum.getIntroduction() });
        if (num>0)
            return true;
        return false;
    }
    
  • 修改用户的操作,创建QueryRunner对象,写SQL语句。

public Boolean update(Curriculum curriculum) throws  SQLException{
    QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
    String sql="update curriculum set curriculumName=?,price=?,introduction=? where id=?";
    int num =runner.update(sql,new Object[] {curriculum .getCurriculumName(),       curriculum.getPrice(),curriculum.getIntroduction(),curriculum.getId()});
    if (num>0)
        return true;
    return false;
}
  • 删除用户的操作,创建QueryRunner对象,写SQL语句。
public Boolean delete(int id) throws SQLException{
    QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
    String sql = "delete from curriculum where id=?";
    int num=runner.update(sql,id);
    if(num>0)
        return true;
    return false;
}

2.1 增加CreateDemo

5.写添加数据库的类:对增加操作进行测试。

创建类:CreateDemo

    Curriculum curriculum =new Curriculum();
    curriculum.setId(3);
    curriculum.setCurriculumName("Springboot基础学习课程");
    curriculum.setPrice(99);
    curriculum.setIntroduction("包含Springboot基础的全套学习课程");
    boolean b =dao.insert(curriculum);
    System.out.println(b);
}
public static void main(String[] args) throws SQLException{
    testInsert();
}

执行结果图:

JavaWeb对于C3P0链接池的CURD实例原理详解

JavaWeb对于C3P0链接池的CURD实例原理详解

2.2 删除DeleteDemo

  1. 写删除数据库的类。testdelete。

    public static void testdelete() throws SQLException {
        boolean b =dao.delete(5);
        System.out.println(b);
    }
    public static void main(String[] args) throws SQLException{
        testdelete();
    }
    

    测试结果如下:

    JavaWeb对于C3P0链接池的CURD实例原理详解

JavaWeb对于C3P0链接池的CURD实例原理详解

2.3 更新 UpdateDemo

7.写一个更新目标类。代码如下:

public static void testupdate() throws SQLException {
    Curriculum curriculum = new  Curriculum();
    curriculum.setId(1);
    curriculum.setCurriculumName("更改完成");
    curriculum.setPrice(200);
    curriculum.setIntroduction("包含java基础的全套学习课程");
    boolean b =dao.update(curriculum);
    System.out.println(b);
}
public static void main(String[] args) throws SQLException{
    testupdate();
}

测试结果如下:

JavaWeb对于C3P0链接池的CURD实例原理详解

JavaWeb对于C3P0链接池的CURD实例原理详解

2.4 查找 FindDemo

8.读取目标数据库里存储的内容,过程如下:

public static void testfind() throws SQLException {
    Curriculum curriculum = dao.find(1);
    System.out.println("id为:"+curriculum.getId()+"课程名为:"+curriculum.getCurriculumName()+"价格为:"
                       +curriculum.getPrice()+"课程介绍:"+curriculum.getIntroduction());
}
public static void main(String[] args) throws SQLException{
    testfind();
}

测试结果如下:

JavaWeb对于C3P0链接池的CURD实例原理详解