DBUTILS的原理简单实现代码

dbutils可以用来简化数据操作的代码,这里我根据反射技术与元数据API写了一个简单的MyUtils的工具类。通过元数据的API可以的到结果集的列数与结果集的每列的数据,然后通过反射技术,获得字节码,并将前面获得的每列的值赋给字节码中对应的字段。下面贴上我写的代码:
首先是工具类的代码:

public class MyUtils
{   
    private DataSource datasource;

    public MyUtils(DataSource datasource)
    {
        super();
        this.datasource = datasource;
    }

    public  void update(String sql,Object...obj)
    {   //updata方法可以实现数据的增删改操作
        try {
            Connection con = datasource.getConnection();
            PreparedStatement ps = con.prepareStatement(sql);
            //使用元数据获得占位符的个数
            ParameterMetaData pm = ps.getParameterMetaData();
            int coun = pm.getParameterCount();
            if(coun!=obj.length)    {throw new RuntimeException();}
            else{
                for (int i = 0; i < obj.length; i++) 
                    ps.setObject(i+1, obj[i]);                  
            }
            ps.executeUpdate();
        } catch (Exception e) { e.printStackTrace(); }
    }

    public Object  query(String sql, BeanHandler bean,Object...obj)
    {   //query可以实现数据的查询工作
        ResultSet rs=null;
        try {
            Connection             con = datasource.getConnection();
            PreparedStatement ps   = con.prepareStatement(sql);
            //使用元数据获得占位符的个数
            ParameterMetaData pm = ps.getParameterMetaData();
            int coun = pm.getParameterCount();
            if(coun!=obj.length)    {throw new RuntimeException();}
            else{
                for (int i = 0; i < obj.length; i++) 
                    ps.setObject(i+1, obj[i]);                  
            }
            rs = ps.executeQuery();
        } catch (Exception e) { e.printStackTrace(); }
        return bean.reback(rs); 
    }
}

然后是仿照dbutils中ResultSetHandler的接口代码:

public interface BeanHandler
{   //面向接口编程
    Object reback(ResultSet rs);
}

然后是实现BeanHandler的两个实现类,分别对应着dbutils中的BeanListHandler与BeanHandler:

public class ListBeanHandler implements BeanHandler
{   
    private Class cla;
    private List<Object> lis;

    public ListBeanHandler(Class cla)
    {
        super();
        this.cla = cla;
    }

    @Override
    public Object reback(ResultSet rs)
    {   
        lis = new ArrayList<Object>();
        try {
            ResultSetMetaData remd = rs.getMetaData();
            int count = remd.getColumnCount();
            while(rs.next()){
                Object bean = cla.newInstance();
                for  (   int i  = 0; i < count; i++) {
                    String s  = remd.getColumnName(i+1);
                    Field   f  = cla.getDeclaredField(s);
                    f.setAccessible(true);
                    f.set(bean, rs.getObject(i+1));
                }
                lis.add(bean);
            }
        } catch (Exception e) { e.printStackTrace(); }
        return lis;
    }
}
public class BeansHandler implements BeanHandler
{   
    private Class cla;
    public BeansHandler(Class cla)
    {   //获得字节码
        super();
        this.cla = cla;
    }
    @Override
    public Object reback(ResultSet rs)
    {   //将结果集封装到bean对象
        Object bean = null;
        try {
            //使用元数据获得结果集的列数
            ResultSetMetaData remd = rs.getMetaData();
            int count = remd.getColumnCount();
                for (int i = 0; i < count; i++) {
                    //通过元数据获得每一列的列名
                    String s = remd.getColumnName(i+1);
                    //使用反射得到字节码中的字段名,然后暴力反射将每一列的值赋给字节码中同名的字段
                    Field   f = cla.getDeclaredField(s);
                        bean = cla.newInstance();
                    f.setAccessible(true);
                    f.set(bean, rs.getObject(s));
                }
        } catch (Exception e) { e.printStackTrace(); }
        return bean;
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值