package util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtilC3P0 {
// 创建连接池的数据源对象
// mysql指定的是从c3p0-config.xml配置文件中选择那个链配置进行连接
private static ComboPooledDataSource cpds = new ComboPooledDataSource(
"mysql");
// 书写返回连接对象的方法
public static Connection getConn() {
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 书写cud的通用的方法
public static void update(String sql, Object params[]) {
// 声明预处理对象
PreparedStatement pstmt = null;
try {
// 获取预处理对象
pstmt = getConn().prepareStatement(sql);
// 为sql语句进行赋值处理
if (params != null) {
for (int i = 0; i < params.length; i++) {
// 为占位符赋值处理
pstmt.setObject(i + 1, params[i]);
}
// 执行cud的操作
pstmt.executeUpdate();
} else {
System.out.println("参数列表为null");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
release(null, pstmt, null);
}
}
// r的操作方法(查询的操作处理
public static Object query(String sql, Object[] params,
ResultSetHandler resultSetHandler) {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = getConn().prepareStatement(sql);
// 参数列表不为null
if (params != null) {
// 循环赋值
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
//执行查询
rs = pstmt.executeQuery();
//将rs结果集交给resultSetHandler处理对象进行处理,并将结果返回
return resultSetHandler.handler(rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 释放资源的操作
public static void release(ResultSet rs, PreparedStatement pstmt,
Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
下面是用来处理接口
package util;
import java.sql.ResultSet;
public interface ResultSetHandler {
// 交给调用者处理
public Object handler(ResultSet rs) throws Exception;
}
下面是处理查询单条数据时用到的处理类
package util;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
//这是获取单个数据的处理类
public class BeanHandler implements ResultSetHandler {
// 声明接收要处理的bean的class对象
private Class<?> cls;
// 构造器为接收的class赋值
public BeanHandler(Class<?> cls) {
super();
this.cls = cls;
}
// 处理接收到的对象
@Override
public Object handler(ResultSet rs) throws Exception {
// 判断结果集中是否还有数据
if (rs.next()) {
// 同过反射处理获取要处理class的对象
Object bean = cls.newInstance();
// 获取ResultSet的元数据的ResultSetMetaData对象
ResultSetMetaData metaData = rs.getMetaData();
// 循环遍历,为bean内的属性赋值
for (int i = 1; i <= metaData.getColumnCount(); i++) {
// 通过元数据获取要赋值的数据字段
String columnName = metaData.getColumnName(i);
// 获取字段对应额数据值
Object columnValue = rs.getObject(columnName);
// 通过反射获取bean的字段名称对应的Field对象
// getDeclaredField("");获取指定的字段已经声明过的Field对象
Field field = bean.getClass().getDeclaredField(columnName);
// 设置暴力反射开启
field.setAccessible(true);
// 为bean中的属性赋值
field.set(bean, columnValue);
}
// 返回设置属性后的bean
return bean;
} else {
return null;
}
}
}
下面是处理查询多条数据时用到的处理类
package util;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
//这是获取数据库中所有的数据的处理类
public class BeanListHandler implements ResultSetHandler {
// 声明接收要处理的bean的class对象
private Class<?> cls;
// 构造器为接收的class赋值
public BeanListHandler(Class<?> cls) {
super();
this.cls = cls;
}
// 处理接收到的对象
@Override
public Object handler(ResultSet rs) throws Exception {
// 声明返回的数据集合
List<Object> list = new ArrayList<Object>();
// 判断结果集中是否还有数据
while (rs.next()) {
// 同过反射处理获取要处理class的对象
Object bean = cls.newInstance();
// 获取ResultSet的元数据的ResultSetMetaData对象
ResultSetMetaData metaData = rs.getMetaData();
// 循环遍历,为bean内的属性赋值
for (int i = 1; i <= metaData.getColumnCount(); i++) {
// 通过元数据获取要赋值的数据字段
String columnName = metaData.getColumnName(i);
// 获取字段对应额数据值
Object columnValue = rs.getObject(columnName);
// 通过反射获取bean的字段名称对应的Field对象
// getDeclaredField("");获取指定的字段已经声明过的Field对象
Field field = bean.getClass().getDeclaredField(columnName);
// 设置暴力反射开启
field.setAccessible(true);
// 为bean中的属性赋值
field.set(bean, columnValue);
}
// 将设置好的目标对象添加到list集合
list.add(bean);
}
return list;
}
}
下面是通过C3P0连接数据时用到的连接配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="xx">
<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">admin</property>
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">30</property>
<property name="minPoolSize">10</property>
<property name="acquireIncrement">5</property>
</named-config>
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">admin</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">30</property>
</named-config>
</c3p0-config>
c3p0的链接还需要用到
c3p0-0.9.5-pre6.jar
mchange-commons-java-0.2.6.3.jar
两个包