Author : Spring

Date :09-03-09 22:44

我们在做项目的时候可以用一个查询类来解决一每个查询功能的反复的代码,下面的这个查询类只要你写一个类来继承它实现其中的ininSql()方法就行,在这上方法中写上你在执行的sql语句

package com.spring.dao.interfaces;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

/*

 * author:spring

 * DateTime:09.02.24 10:21

 */

public abstract class BaseQuery {

    /*

     * 1/基本查询用到的属性

     */

    private int count;//总页数

    protected String onPage = "1";//当前页 

    protected int pageSize = 5;//每页显示条数

   

    protected Connection conn;//连接对象

    protected PreparedStatement ps;//ps

    protected ResultSet rs;//rs

    protected Map dto;//传来的数据、条件的判断

    protected StringBuilder sql;//sql语句

    protected List pars;//设置ps中的参数列表

    protected int fetchSize;//总条数

   

    protected Collection colls;

    /*

     * 2/构造方法(要一个Connection对象,一个Map dto对象)

     */

    public BaseQuery(Connection conn,Map dto){

       this.conn = conn;

       this.dto = dto;

       String page = (String)dto.get("onPage");

       if(page != null && !page.equals("")){

           this.onPage = page;        

       }

       this.initSql();

    }

    /*

     * 3/初始sql语句

     */

    public abstract void initSql();

    /*

     * 4/编译sql语句并招行

     */

    public void preparedStatement() throws SQLException{

           //编译

           ps = conn.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

           //设置sql语句的参数

           if(this.pars != null){

              int size = this.pars.size();

              if(size>0){

                  for(int i=0;i<size;i++){

                     ps.setObject(i+1, this.pars.get(i));

                  }

              }

           }

           //执行

           this.rs = this.ps.executeQuery();

    }

    /*

     * 5/执行返回结果集

     */

    public List queryAll() throws SQLException{

//这个方法你可以写上你的分页等一些操作

       ArrayList arRS = null;

    this.preparedStatement();//1.先调用编译sql的方法

ResultSetMetaData rsm = null;

 try{

             //6.定义返回值

             arRS = new ArrayList();

           

             rsm = rs.getMetaData();                 

             int size=rsm.getColumnCount();

             Map row = null;

             while(rs.next())

             {

                  row = new HashMap();

                  for (int j = 1; j <=size; j++)

                  {

                       row.put(rsm.getColumnLabel(j).toLowerCase(), rs.getString(j));

                  }

                  arRS.add(row);

                  row=null;

                  rs.next();

             }

             return arRS;

       }finally{

           close(rs);

           close(ps);

           if(rsm != null){

              rsm = null;

           }

       }

    }

    /*

     * 关闭ps方法

     */

    private void close(PreparedStatement ps){

       if(ps != null){

           try{

              ps.close();

           }catch(SQLException e){

              e.printStackTrace();

           }

       }

    }

    private void close(ResultSet rs){

       if(rs != null){

           try{

              rs.close();

           }catch(SQLException e){

              e.printStackTrace();

           }

       }

    }

    /*

     * .清空Collection实现类的方法

     */

    private void clear(Collection c){

       if(c != null){

           c.clear();

       }

    }

}

下面来用一个类继承这个抽象类看一看

package com.spring.dao.daoimpl;

import com.spring.system.DBUtils;

import com.spring.system.Tools;

public class UsersBQDAOImpl extends BaseQuery {

    public UsersBQDAOImpl(Connection conn, Map dto) {

       super(conn, dto);

    }

    /*

     * 初始化查询语句

     * @see com.spring.dao.interfaces.BaseQuery#initSql()

     */

    @Override

    public void initSql() {

       //1.初始化要执行的sql语句

       this.pars = new ArrayList();

       this.sql = new StringBuilder()

       .append("SELECT U_ID,U_NAME,U_EMAIL,U_RATING,U_STATE,B_CODEVALUE FROM V_USERS");

    }

}

//这个类只要继承BaseQuery.java重写initSql();方法就行,在这个方法中写上要执行的查询的sql语句;

这样就可在执行你的业务操作了如下面我就在Action中调用一下:

BaseQuery bq = new FoodBQDAOImpl(conn, dto);

           List rows =bq.queryAll();

这样就实现了一个查询的抽象类,这样以后就可不用写那么多的查询代码了,只要有查询操作的话就可实现这个类就行了
    这里我只想让大家知道这个抽象类的用法,只要继承它就重写initSql();方法就可以实现查询功能.
  所以这里的分页你们可以自己写一个,只要在红字部分写就行了。

这里的我还没有用分页因为太多了下载这个只要把红字那个用调用查询类中的方法就可了,因为这个类也是别人写的