您的位置:首页 > 其它

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+"==============================================");

}

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