使用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()); } } }
查询所有测试成功效果
相关文章推荐
- 利用反射实现对sqlite3数据库的crud(增删改查)操作的一个baseAndroidDao封装,安卓开发中
- 使用XML封装数据库操作语句的实现(zz)
- 使用XML封装数据库操作语句的实现
- 使用XML封装数据库操作语句的实现
- 使用C#和ADO.NET数据库访问技术,实现CRUD--20180127
- 使用XML封装数据库操作语句的实现
- Android数据库CRUD操作的封装与实现
- 泛型dao架构实现,封装crud等基本操作
- Silverlight2数据操作(1)——使用ASP.NET Web Service进行数据CRUD操作(上) - 星辰技术社区
- Spring使用JdbcTemplate实现对数据库操作
- 使用ThreadLocal、Apache的dbutils的QueryRunner和dbcp2数据库连接池的BasicDataSource封装操作数据库工具
- 使用存储过程操作数据库(实现增删改查)
- 使用Cufon技术实现Web自定义字体2
- Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
- 使用MyBatis对表执行CRUD操作——基于XML的实现
- C++使用ADO技术实现Excel文件的读写操作
- Struts学习总结(七)---使用Struts2实现用户信息的CRUD操作(一:查询操作)
- IOS使用FMDB封装的数据库增删改查操作
- Java注解及通过自定义Java注解实现数据库的操作
- Struts学习总结(八)---使用Struts2实现用户信息的CRUD操作(二:添加操作)