您的位置:首页 > 数据库

使用c3p0技术实现对数据库crud操作的自定义封装

2014-01-05 21:33 661 查看

一:什么是c3p0?

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目Hibernate,Spring等。

二:c3p0 与dbcp 的区别?

c3p0有自动回收空闲连接功能

dbcp没有自动回收空闲连接的功能

三: 使用c3p0技术自定义框架实现对数据库crud 操作的封装

一:准备所依赖 的jar 包

http://sourceforge.net/projects/c3p0/ 在这里可以下载所依赖的jar 包





二:书写代码---实现所需功能

一: 实体bean:

 此处的实体命名一定要和数据库统一
package bean;

public class User {

private Integer id;
private String name;

private String sex;

private Integer age;

public User() {
super();
// TODO Auto-generated constructor stub
}

public User(Integer id, String name, String sex, Integer age) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
+ age + "]";
}

}

二:接口方法:

package dao;

import java.util.List;

public interface BaseDao<T,PK> {

T findById(PK id);
void deleteById(PK id)throws Exception;
void delete(T entity)throws Exception;

void deletes(String ids[])throws Exception;

void update(T entity)throws Exception;
void insert(T entity)throws Exception;

List<T> findAll();
}

package dao;

import bean.User;

public interface UserDao extends BaseDao<User, Integer> {

}

三: 接口的实现类

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

import com.mchange.v2.c3p0.impl.DbAuth;

import util.BeanHanlder;
import util.BeanListHanlder;
import util.DBConn;

import bean.User;
import dao.UserDao;

public class UserDaoImpl_c3p0 implements UserDao{

private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;

@Override
public User findById(Integer id) {
String sql="select id,name,sex,age from user where id=?";

return (User) DBConn.query(sql, new Object[]{id}, new BeanHanlder(User.class));
}

@Override
public void deleteById(Integer id) throws Exception {
String sql="delete from user where id=?";
DBConn.update(sql, new Object[]{id});

}

@Override
public void delete(User entity) throws Exception {
deleteById(entity.getId());
}

@Override
public void deletes(String[] ids) throws Exception {
// TODO Auto-generated method stub

}

@Override
public void update(User entity) throws Exception {
String sql="updata user set name=?,sex=?,age=? where id=?";
DBConn.update(sql, new Object[]{entity.getName(),entity.getSex(),entity.getAge(),entity.getId()});

}

@Override
public void insert(User entity) throws Exception {

String sql="insert into user (name,sex,age) values(?,?,?)";
DBConn.update(sql, new Object[]{entity.getName(),entity.getSex(),entity.getAge()});
}

@Override
public List<User> findAll() {

String sql = "select id,name,sex,age from user limit ?,?";
return (List<User>) DBConn.query(sql, new Object[]{1,2}, new BeanListHanlder(User.class));
/*	  此处 可以 测试 查询所有 和  简单的分页 查询
* String sql = "select id,name,sex,age from user";

return (List<User>) DBConn.query(sql, null, new BeanListHanlder(User.class));
*/	}

}


四:封装的连接 数据库,crd 的---update  方法 以及 释放资源的 方法

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

import com.mchange.v2.c3p0.impl.DbAuth;

import util.BeanHanlder;
import util.BeanListHanlder;
import util.DBConn;

import bean.User;
import dao.UserDao;

public class UserDaoImpl_c3p0 implements UserDao{

private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;

@Override
public User findById(Integer id) {
String sql="select id,name,sex,age from user where id=?";

return (User) DBConn.query(sql, new Object[]{id}, new BeanHanlder(User.class));
}

@Override
public void deleteById(Integer id) throws Exception {
String sql="delete from user where id=?";
DBConn.update(sql, new Object[]{id});

}

@Override
public void delete(User entity) throws Exception {
deleteById(entity.getId());
}

@Override
public void deletes(String[] ids) throws Exception {
// TODO Auto-generated method stub

}

@Override
public void update(User entity) throws Exception {
String sql="updata user set name=?,sex=?,age=? where id=?";
DBConn.update(sql, new Object[]{entity.getName(),entity.getSex(),entity.getAge(),entity.getId()});

}

@Override
public void insert(User entity) throws Exception {

String sql="insert into user (name,sex,age) values(?,?,?)";
DBConn.update(sql, new Object[]{entity.getName(),entity.getSex(),entity.getAge()});
}

@Override
public List<User> findAll() {

String sql = "select id,name,sex,age from user limit ?,?";
return (List<User>) DBConn.query(sql, new Object[]{1,2}, new BeanListHanlder(User.class));
/*	  此处 可以 测试 查询所有 和  简单的分页 查询
* String sql = "select id,name,sex,age from user";

return (List<User>) DBConn.query(sql, null, new BeanListHanlder(User.class));
*/	}

}

五: 所依赖的 查询的封装类

 结果集的接口----------------

package util;

import java.sql.ResultSet;

public interface ResultSetHanlder {

// 声明一个方法用来处理查询的结果集
public Object handler(ResultSet rs)throws Exception;
}

单个的封装类

package util;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class BeanHanlder implements ResultSetHanlder {

// 声明 这是处理的bean 的class  对象
private Class clazz;
// 构造器初始化  clazz 的对象
public BeanHanlder(Class clazz) {
super();
this.clazz = clazz;
}
@Override
public Object handler(ResultSet rs) throws Exception {

if(rs.next()){
Object bean=clazz.newInstance();// 反射
// 获得代表resulset 元素数据的ResultSetMetaData 对象
ResultSetMetaData metaData=rs.getMetaData();
// 遍历
for(int i=1;i<=metaData.getColumnCount();i++){
// 获取表中的 字段名称
String columnName=metaData.getColumnName(i);
Object columnValue=rs.getObject(columnName);
// 通过反射 获取 bean 的name 对应的Field 对象
Field f=bean.getClass().getDeclaredField(columnName);
f.setAccessible(true);// 暴力
f.set(bean, columnValue);// 设值

}

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 BeanListHanlder implements ResultSetHanlder {

// 这是 处理bean de class 对象

private Class clazz;
public BeanListHanlder(Class clazz) {
super();
this.clazz = clazz;
}
@Override
public Object handler(ResultSet rs) throws Exception {

List list=new ArrayList();
while(rs.next()){
Object bean=clazz.newInstance();// 反射
// 获得代表resulset 元素数据的ResultSetMetaData 对象
ResultSetMetaData metaData=rs.getMetaData();
// 遍历
for(int i=1;i<=metaData.getColumnCount();i++){
// 获取表中的 字段名称
String columnName=metaData.getColumnName(i);
Object columnValue=rs.getObject(columnName);
// 通过反射 获取 bean 的name 对应的Field 对象
Field f=bean.getClass().getDeclaredField(columnName);
f.setAccessible(true);// 暴力
f.set(bean, columnValue);// 设值

}
list.add(bean);
}
return list;
}

}

数据库的xml 配置文件

命名必须规范-----c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="xx">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/hiber</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">199358</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/hiber</property>
<property name="user">root</property>
<property name="password">199358</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>


测试类

package junit;

import java.util.List;

import org.junit.Test;

import bean.User;
import dao.UserDao;
import dao.impl.UserDaoImpl_c3p0;

public class TestDemo {

UserDao userDao=new UserDaoImpl_c3p0();
@Test
public void findById(){

User u=userDao.findById(1);
System.out.println(u.toString());

}
@Test
public void insert() throws Exception{

User user=new User(null, "wangchong", "M", 20);
userDao.insert(user);
}
@Test
public void findAll(){

List<User> entityes=userDao.findAll();
for (User user : entityes) {
System.out.println(user.toString());
}

}
}

查询所有测试成功效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息