自己编写jdbc框架

package com.itheima.util;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

/**
 * 此类是sql语句的辅助类
 * @author simon
 *
 */
public class DbAssit
{
	//在引用此类的时候就会要求传入数据源
	private DataSource dataSource;
	public DbAssit(DataSource dataSource)
	{
		this.dataSource = dataSource;
	}
	//此方法适合增,删,改操作
	public void update(String sql,Object[] param)
	{
		Connection conn = null;
		PreparedStatement pst = null;
		
		try
		{
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql);
			//获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象
			ParameterMetaData pm = pst.getParameterMetaData();
			//获取sql语句中参数的个数
			int pmCount = pm.getParameterCount();
			
			if(pmCount>0)
			{
				//首先要判断传进来的参数要不为空,并且参数的个数要和sql语句中的占位符个数相同
				if(param==null && param.length!= pmCount)
				{
					throw new RuntimeException();
				}
				//sql语句的参数和传入的参数个数相同的话,则用prepareStatement去设置占位符的值
				for(int i=0;i<pmCount;i++)
				{
					pst.setObject(i+1, param[i]);
				}
			}
			pst.executeUpdate();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			closeAll(conn,pst,null);
		}
	}
	//删除,ResultSetHandler rsh这是一个接口
	public Object query(String sql,Object[] param,ResultSetHandler rsh)
	{
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		
		try
		{
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql);
			//获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象
			ParameterMetaData pm = pst.getParameterMetaData();
			//获取sql语句中参数的个数
			int pmCount = pm.getParameterCount();
			
			if(pmCount>0)
			{
				//首先要判断传进来的参数要不为空,并且参数的个数要和sql语句中的占位符个数相同
				if(param==null && param.length!= pmCount)
				{
					throw new RuntimeException();
				}
				//sql语句的参数和传入的参数个数相同的话,则用prepareStatement去设置占位符的值
				for(int i=0;i<pmCount;i++)
				{
					pst.setObject(i+1, param[i]);
				}
			}
			rs = pst.executeQuery();
			
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		//返回用传入的接口调用他们自己的方法,传入结果集,返回一个对象
		return rsh.handler(rs);
	}
	
	
	
	
	
	private void closeAll(Connection conn,PreparedStatement ps,ResultSet rs)
	{
		if(conn!=null)
		{
			try
			{
				conn.close();
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
			conn=null;
		}
		if(ps!= null)
		{
			try
			{
				ps.close();
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
			ps=null;
		}
		if(rs!= null)
		{
			try
			{
				rs.close();
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
			rs= null;
		}
	}

	//此方法适合查询操作
}

package com.itheima.util;

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

public class BeanHandler implements ResultSetHandler
{
	public Class clazz;
	
	public BeanHandler(Class clazz)
	{
		this.clazz = clazz;
	}

	public Object handler(ResultSet rs)
	{
		try
		{
			if(rs.next())
			{
				Object instance = clazz.newInstance();
				ResultSetMetaData rsmd = rs.getMetaData();
				int count = rsmd.getColumnCount();
				for(int i=0;i<count;i++)
				{
					String name = rsmd.getColumnName(i+1);
					Object obj = rs.getObject(i+1);
					Field field = clazz.getDeclaredField(name);
					field.setAccessible(true);
					field.set(instance, obj);
				}
				return instance;
			}
			else
			{
				return null;
			}
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}

}
package com.itheima.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
{
	private Class clazz;
	public BeanListHandler(Class clazz)
	{
		this.clazz = clazz;
	}

	public Object handler(ResultSet rs)
	{
		List list = new ArrayList();
		try
		{
			while(rs.next())
			{
				Object instance = clazz.newInstance();
				ResultSetMetaData rsmd = rs.getMetaData();
				int count = rsmd.getColumnCount();
				for(int i=0;i<count;i++)
				{
					String name = rsmd.getColumnName(i+1);
					Object obj = rs.getObject(i+1);
					Field field = clazz.getDeclaredField(name);
					field.setAccessible(true);
					field.set(instance, obj);
				}
				list.add(instance);
			}
			return list;
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}

}

package com.itheima.util;

import java.sql.ResultSet;

public interface ResultSetHandler
{
	Object handler(ResultSet obj);

}


下面是测试类
package com.itheima.util;

import java.util.List;

import org.junit.Test;

import com.itheima.util.Account;

public class AccountDao
{
	private DbAssit da = new DbAssit(new C3P0Util().getDatasource());
	@Test
	public void add()
	{
		String sql = "insert into account(id,name,money) values(?,?,?)";
		da.update(sql, new Object[]{8,"ggg",1000});
	}
	@Test
	public void update()
	{
		String sql = "update account set money = 1000";
		da.update(sql, null);
	}
	@Test
	public void delete()
	{
		String sql = "delete from account where id = ?";
		da.update(sql, new Object[]{8});	
	}
	@Test
	public void query()
	{
		String sql = "select * from account";
		ResultSetHandler rsh = new BeanListHandler(Account.class);
		List<Account> as = (List<Account>) da.query(sql, null,rsh );
		for(Account ac :as)
		{
			System.out.println(ac);
		}
		
	}

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值