数据库中的QueryRunner的大致实现

来源:互联网 发布:知乎反对能看到吗 编辑:程序博客网 时间:2024/06/03 09:25

public class MyQueryRunner{

    private DataSource source;

    public MyQueryRunner(DataSource source){

     this.source = source;

     }

   

   public int update(String sql,Object... params)throws SQLException{

       //从数据连接池中获取连接

        Connection conn = source.getConnection();

      //通过连接上的方法得到预处理

         PreparedStatement ps = conn.PreparStatement(sql);

       //得到预处理上的元数据

        ParameterMetaData metaData = ps.getParameterMetaData();

        //通过元数据得到sql语句中?的个数

        int count = metaData.getParameterCount();

       //如果sql语句中的?的个数和参数中的个数不同就抛出异常

       if(count!=params.length)

       throw new RuntimeException("paramter error!");

     //把预处理上的每个?都设置相应的参数注意是1开始

       for(int i=1;i<count;i++)

          ps.setObject(i,params[i-1]);

     //执行那条预处理语句并得到改变的行数

      int num = ps.executeUpdate();

      //关闭连接和预处理

        Dbutils.closeQuietly(conn,ps,null);

         return num;

    }


     public<T> T query(String sql,ResultSetHander<T> rsh,Object... params)throws SQLException{

             Connection conn = source.getConnection();

            PreparedStatment ps = conn.PrepareStatement(sql);

            ParameterMetaData metaData = ps.getParameterData();

           int count = metaData.getParameterCount();

            if(count!=params.length)

           throw new RuntimeException();

           for(int i=1;i<=count;i++)

              ps.setObject(i,params[i-1]);

         //掉用预处理上的的查询方法返回ResultSet

          ResultSet rs = ps.executeQuery();

          //调用ResultSetHander对象上的hand()方法ResultSet作为参数传入

              T t = rsh.hand(rs);

            Dbutils.closeQuietly(conn,ps,rs);

          return t;

     }

}

0 1
原创粉丝点击