DBUtils框架(自定义)
2014-03-06 20:59
267 查看
一:DBAssist类(框架入口文件)
package f.cn.itcast.dbassist; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javax.sql.DataSource; import f.cn.itcast.dbassist.handler.ResultSetHandler; import b.cn.itcast.utils.JdbcUtils; public class DBAssist { // 提供一个 update方法 ,负责 增,删,该操作 //JdbcUtil静态方法获取连接池 private DataSource ds; public DBAssist(DataSource ds ){ this.ds = ds; } public void update(String sql, Object[] params){ Connection conn = null; PreparedStatement stmt = null; try{ // 你要用 我的框架, 就给 我传个 连接池 进来, conn= ds.getConnection(); stmt = conn.prepareStatement(sql); // 替换 站位 符 ParameterMetaData pmd = stmt.getParameterMetaData(); // 获得占位符的个数 int count = pmd.getParameterCount(); if(count>0){ // 说明 有占位符 if(params==null){ throw new IllegalArgumentException("sorry, the paramters are wrong"); } if(count!=params.length){ throw new IllegalArgumentException("sorry, the paramter count doesn't match .."); } //如果走到了 这里 ,则说明占位符 跟 传进来的 参数 个数 一致 ,那么 替换占位符 for (int i = 0; i < count; i++) { stmt.setObject(i+1, params[i]); } } // 执行更新 stmt.executeUpdate(); }catch (Exception e) { throw new DBAssistException(e); }finally{ release(null, stmt, conn); } } // select * from account ; select * from account where name=? //这里参数传入一个handler,接口,所以传入handler的实现 类,多态的运用 public Object select(String sql, Object[] params,ResultSetHandler hanler){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try{ // 你要用 我的框架, 就给 我传个 连接池 进来, conn= ds.getConnection(); stmt = conn.prepareStatement(sql); // 替换 站位 符 ParameterMetaData pmd = stmt.getParameterMetaData(); // 获得占位符的个数 int count = pmd.getParameterCount(); if(count>0){ // 说明 有占位符 if(params==null){ throw new IllegalArgumentException("sorry, the paramters are wrong"); } if(count!=params.length){ throw new IllegalArgumentException("sorry, the paramter count doesn't match .."); } //如果走到了 这里 ,则说明占位符 跟 传进来的 参数 个数 一致 ,那么 替换占位符 for (int i = 0; i < count; i++) { stmt.setObject(i+1, params[i]); } } // 执行更新 rs = stmt.executeQuery(); // 封装了 结果 数据 , // 现在 只有 结果集 对象 ,至于 这个结果集中 解析 后 要返回 是 一个 所有 的 表的数据还是 一行 的数据 , 谁知道 呢 ? // 调用这个方法的人 知道 . return hanler.handle(rs); }catch (Exception e) { throw new DBAssistException(e); }finally{ release(null, stmt, conn); } } private static void release(ResultSet rs, Statement stmt, Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } rs = null; } if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } stmt = null; } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } conn = null; } } }
二:JdbcUtil 为DBAssist提供数据源和Connection,对数据源进一步封装
public class JdbcUtils {// 使用 c3p0 连接池 改造 jdbcutils工具类
private static ComboPooledDataSource cpds = new ComboPooledDataSource();
public static DataSource getDataSource (){
return cpds;
}
public static Connection getConnection(){
try {
return cpds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
三:ResultSetHandler接口及BeanLIstHandler和BeanHandler处理类
public interface ResultSetHandler {// 这个 方法 用来 处理 resultset中数据, 完成封装 ....
Object handle(ResultSet rs);
}
BeanListHandler的实现
public class BeanListHandler implements ResultSetHandler {private Class clazz;
public BeanListHandler(Class clazz) {
this.clazz =clazz;
}
@Override
public Object handle(ResultSet rs) {
List list = new ArrayList();
try {
while(rs.next()){
// 准备 一个 javabean对象, 然后 在 每一行解析的时候 将 解析到 的数据封装进去
Object bean = clazz.newInstance();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
for (int i = 0; i < count; i++) {
// 拿到 列名
String columnName = rsmd.getColumnName(i+1);
// 又 由于 列名 与 要封装的 javabean的字段一样 .所以 可以 通过反射 技术 来封装数据到 javabean中了
Field field = clazz.getDeclaredField(columnName); // 获得 私有的 字段名
field.setAccessible(true);
// 拿到 当前这行的 这个字段的数据
Object value = rs.getObject(i+1);
field.set(bean, value);
}
list.add(bean);
}
return list;
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
}
BeanHandler实现
public class BeanHandler implements ResultSetHandler{private Class clazz;
public BeanHandler(Class clazz) {
this.clazz =clazz;
}
/*
*
* 作业 : 完成 select * from account where 系列的 返回 一行记录 ,然后封装到 javabean的 情况 .
*
*/
@Override
public Object handle(ResultSet rs) {
try {
rs.next();
Object bean = clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
String columnName = metaData.getColumnName(i+1);
Object value = rs.getObject(i+1);
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(bean,value);
}
return bean;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
四:测试类SomeDao
package c.cn.itcast.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.junit.Test;
import b.cn.itcast.utils.JdbcUtils;
import c.cn.itcast.domain.Account;
import c.cn.itcast.domain.User;
import f.cn.itcast.dbassist.DBAssist;
import f.cn.itcast.dbassist.handler.BeanHandler;
import f.cn.itcast.dbassist.handler.BeanListHandler;
/*
*
* dao 用来 与 数据源 ( 数据库) 打交道
*
*/
public class SomeDao {
//第次请求new一个DBAssist类,调用 其方法,每次构造器传入的是一个static变量,
DBAssist dbas = new DBAssist(JdbcUtils.getDataSource());
@Test
public void add(){
dbas.update("insert into account values(?,?,?)", new Object[]{6,"fangzhen",10000});
}
@Test
public void delete(){
dbas.update("delete from account where name=?", new Object[]{"ls"});
}
@Test
public void update(){
dbas.update("update account set money=? where name=?",new Object[]{20000,"zs"});
}
@Test
public void selectAll(){
//List<Account> list = (List) dbas.select("select * from account", null, new BeanListHandler(Account.class));
List<Account> list = (List) dbas.select("select * from account", null, new BeanListHandler(Account.class));
for (Account account : list) {
System.out.println(account);
}
}
@Test
public void selectSingle(){
Account account = (Account) dbas.select("select * from account where name = ?", new Object[]{"robbin"}, new BeanHandler(Account.class));
System.out.println(account+"==============================================");
}
}
相关文章推荐
- cocos2d-x 街机摇杆 实现
- UVa 10577 Bounding box (直线交点&正多边形中心)
- Delphi 判断时间是否合法 -IsValidDateTime、IsValidDate、IsValidTime、IsValidDateDay
- 基于动态库的C++插件开发模型
- 初学SSH框架所需注意的基本点
- 【原创】第一次写博客
- 推荐一个好的博客下载工具
- 【原创】第一次写博客
- gtk+-3.0- install
- HTTP返回码总结
- poj 1860 Currency Exchange (Bellman_ford 算法)
- ios UINavigationController
- 九度 1521:二叉树的镜像
- 如何修改mysql数据库中的密码
- Spring面试题
- 补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- 数据库 元数据的 api 学习
- 黑马程序员_正则表达式
- 使用MAVEN请注意,MAVEN不支持最新版jdk1.7
- linux zip包压缩 解压