c3p0连接池整合jdbc

Posted 整理是一切的开始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c3p0连接池整合jdbc相关的知识,希望对你有一定的参考价值。

需要的jar包如下
技术图片
在src下面新建一个xml配置文件用来写连接池相关配置,名字必须为c3p0-config.xml,必须在src下面,如下图
技术图片
c3p0-config.xml配置文件内容为

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
     <default-config>
           <!--连接四大参数配置 -->
           <property  name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
           <property  name="driverClass">com.mysql.jdbc.Driver</property>
           <property name="user">root</property>
           <property name="password">1234</property>
           <!-- 池参数配置 -->
           <property name="acquireIncrement">3</property>
           <property name="initialPoolSize">10</property>
           <property name="minPoorSize">2</property>
           <property name="maxPoorSize">10</property>
     </default-config>
</c3p0-config>

写一个jdbcUtils工具类,用于返回连接池对象

package com.aaa.demo;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class jdbcUtils {
//配置文件的默认位置,要求你必须给出c3p0-config.xml!!!
     private static ComboPooledDataSource datasource=new  ComboPooledDataSource();
     /**
      * 使用连接池返回一个连接对象
      * @throws SQLException
      */
     public static Connection getConnection() throws  SQLException{
           return datasource.getConnection();
     }
     /**
      * 返回连接池对象
      */
     public static DataSource getDataSource(){
           return datasource;
     }
}

最后编写一个jdbc工具类,写增删改查方法。

package com.aaa.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
public class jdbc {
/**
* 获取数据list<Map>
* @throws SQLException
*/
public static List<Map<String,Object>> selectMap(String  sql,Object[] params) throws SQLException{
    List<Map<String,Object>> tableList = null;
    Connection con = jdbcUtils.getConnection();//建立一个连接池中的连接
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        ps = con.prepareStatement(sql);
        setParams(params,ps);
        rs = ps.executeQuery();
        //获取数据的列数
        ResultSetMetaData rsmd = rs.getMetaData();
        int  count = rsmd.getColumnCount();
        //System.out.println(count);
        tableList = new ArrayList<Map<String,Object>>();//大盒子
        while(rs.next()){
            Map<String,Object> rowMap = new  HashMap<String,Object>();//小盒子
            for(int i=0;i<count;i++){//遍历数据的列数
                // map  key 列名    value 对应列名的值
                rowMap.put(rsmd.getColumnName(i+1),  rs.getObject(i+1));//往小盒子里面添加每一行的值
            }
            tableList.add(rowMap);//把小盒子放入大盒子里面
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        closeAll(rs,ps,con);
    }
    return  tableList;
}
/**
* 4:增删改
* @param args
*/
public int insertAndUpdateAndDelete(String sql,Object[] params){
    //获取数据库连接
    Connection con =null;
    PreparedStatement ps=null;
    int row = 0;
    try {
        //预编译sql语句
      con=jdbcUtils.getConnection();建立一个连接池中的连接
        ps = con.prepareStatement(sql);
        //设置参数
        setParams(params,ps);
        //执行sql语句
        row =ps.executeUpdate();//row ? 执行sql获取受影响的行 0 没有改变  1 成功
    } catch (SQLException e) {
        System.out.println("sql语句有误");
        e.printStackTrace();
    }finally{
        closeAll(null,ps,con);
    }
    return row;
}
/**
* 5:设置参数
* @param params
*/
public static void setParams(Object[] params,PreparedStatement  ps) {
    if(params==null) return;
    for (int i = 0; i < params.length; i++) {
        try {
            ps.setObject(i+1, params[i]);
        } catch (SQLException e) {
            System.out.println("第"+i+1+"个参数有误");
            e.printStackTrace();
        }
    }
}
/**
* 6:关闭所有的连接
* @param args
*/
public static void closeAll(ResultSet rs,PreparedStatement  ps,Connection con ){
    //注:关闭是有顺序的
    try {
        if(rs!=null){
            rs.close();
        }
        if(ps!=null){
            ps.close();
        }
        if(con!=null){
            con.close();
        }
    } catch (Exception e) {
         
    }
}
}

写一个测试类测试是否成功

public class test1 {
public static void main(String[] args) throws SQLException{
     String sql="select * from stu";
     List<Map<String, Object>> list=jdbc.selectMap(sql,null);
     System.out.println(list);
}
}

打印结果
技术图片

以上是关于c3p0连接池整合jdbc的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE基础(06):Servlet整合C3P0数据库连接池

详解C3P0(数据库连接池)

spriongboot与数据源的整合以及SQL监控

C3P0连接池的使用

C3P0连接池的使用

C3P0连接池操作数据库