使用jdbc編寫查詢框架


一、使用jdbc編寫查詢框架

除SQL語句不同之外,根據操作的實體不同,對ResultSet的映射也各不相同,因此可義一個query方法,除以參數形式接收變化的SQL語句外,可以使用策略模式由qurey方法的調用者決定如何把ResultSet中的數據映射到實體對象中

在DBManager類中-------------------此類是一個數據庫連接池和框架類

public class DBManager {

 

    private static DataSource ds=null;

    //加載配置文件

    static{

       InputStream in=DBManager.class.getClassLoader().getResourceAsStream("config/dbcp.properties");

       //映射類型的集合,用來存放讀取出來的鍵值對

       Properties p=new Properties();

       try {

           p.load(in);

           //通過配置文件構建數據庫連接池

           ds=BasicDataSourceFactory.createDataSource(p);

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

    }

    public static Connection getconnConnection() throws SQLException{

      

       return ds.getConnection();

    }

    //歸還到數據庫連接池中

    public static void release(Connection con,Statement st,ResultSet rs){

       if (rs != null)

           try {

              rs.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       if (st != null)

           try {

              st.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       if (con != null)

           try {

              con.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

    }

    //進行代碼優化

    public static void update(String sql,Object []params ){

 

       Connection con=null;

       PreparedStatement st=null;

       ResultSet rs=null;

      

       try {

           con=DBManager.getconnConnection();

           st=con.prepareStatement(sql);

           for(int i=0;i<params.length;i++){

              st.setObject(i+1,params[i]);

           }

           st.executeUpdate();

       } catch (SQLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }finally{

           DBManager.release(con, st, rs);

       }

      

    }

   

    public static Object find(String sql,Object []params,ResultSetHandlerrsh) throws SQLException{

      

       Connection con=null;

       PreparedStatement st=null;

       ResultSet rs=null;

       

       try {

           con=DBManager.getconnConnection();

           st=con.prepareStatement(sql);

           for(int i=0;i<params.length;i++){

              st.setObject(i+1,params[i]);

           }

           rs=st.executeQuery();

           return rsh.handler(rs);

       }finally{

           DBManager.release(con, st, rs);

       }

      

    }

}

由於不知道程序員是怎麼處理結果集的,所以將結果集的操作封裝到一個接口中

如下:

 

public interface ResultSetHandler {

 

        public Object  handler(ResultSet rs);

}

實現接口的類處理結果集

public class BeanListHandler implements ResultSetHandler {

 

    private Class clazz;

    public BeanListHandler(Class clazz){

       this.clazz=clazz;

    }

    @Override

    public Object handler(ResultSet rs) {

       List list=new ArrayList();

       try {

           while(rs.next()){

              //讀取一行

             

              //將其封裝到bean對象中

              Object bean=clazz.newInstance();

              ResultSetMetaData meta=rs.getMetaData();

              int count=meta.getColumnCount();

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

                  String name=meta.getColumnName(i);

                  Object value=rs.getObject(name);

                  Field f=clazz.getDeclaredField(name);

                  f.setAccessible(true);

                  f.set(bean, value);

              }

              //把bean對象加入到list集合中

              list.add(bean);

           }

          

       return list;

 

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           throw new RuntimeException(e);

       }

    }

 

}

 

在userDaoImpl中調用此方法:

public void insert(){

QueryRunner runner=new QueryRunner(DBManagaer_c3p0.datasource());

String sql="insert into users(name,password) values('pp','1111')";

    try {

           runner.update(sql);

    } catch (SQLException e) {

       // TODO Auto-generatedcatch block

       e.printStackTrace();

    }

   

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章