需要的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);
}
}
打印结果