javaWeb核心技术第十二篇之分页和条件

分页:limit ?,?
    参数1 : startIndex  开始索引.
    参数2 : pageSize  每页显示的个数
    n 表示第几页 给定一个特殊的单词  pageNumber
    select * from product;
    
    第一页显示五条数据:
    select * from product LIMIT 0 , 5;
    第二页显示五条数据
    select * from product LIMIT 5 , 5;
    第三页显示五条数据
    select * from product LIMIT 10 , 5;
    
    第N页显示五条数据
    select * from product LIMIT (pageNumber-1)*pageSize , pageSize;
    
    如果只有一个参数 表示 第一页 显示几个数据
    select * from product LIMIT 5;
    
    简单分页查询步骤:
        1.sql : select from table limit ?,?
        2.startIntdex : 开始索引  不可以是负数
        3.pageSize : 每页显示的个数
        4.pageNumber : 用户访问的当前页
        5.由页面发起传入 pageNumber 和 pageSize(目前写死)  在service层中进行计算startIndex
        6.公式 (pageNumber-1)*pageSize
    
    高级分页查询:
        将service返回的六个参数,封装成一个PageBean
    两个传的
        pageNumber,pageSize.
    两个查的
        totalRecord,data
    两个算的
        startIndex,totalPage
    
    在service编写代码逻辑 --> 将所有的代码逻辑封装到PageBean中
    
/*
    
    <!--分页  class="disabled"  class="active"-->
        <div style="width:1100px;margin:0 auto;margin-top:50px;">
            
            <ul class="pagination" style="text-align:center; margin-top:10px;">
                
                <%-- 如果当前页 等于 1 不需要再显示上一页  如果当前不等于1 显示 --%>
                <c:if test="${pageBean.pageNumber != 1}">
                    <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                    <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
                </c:if>
                
                <%-- 循环显示 所有的页数 --%>
                <c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
                    <li ${pageBean.pageNumber == num ? " class='active'"  : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
                </c:forEach>
                
                <%-- 如果当前页小于总页数 显示下一页 --%>
                <c:if test="${pageBean.pageNumber < pageBean.totalPage}">
                    <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
                    <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
                </c:if>
                
                
            </ul>
            
        </div>
        <!-- 分页结束=======================        -->
    

    以后专门用来处理分页的数据:
    泛型的定义:
        1:方法级别的定义,修饰和返回值之间<T>
        2:类级别泛型定义,类名后<T>
    public class PageBean<T> {
        /*
        一共六个参数:
        2个传入:
            pageNumber : 表示当前页
            pageSize : 表示每页显示个数
        2个查询
            data : 分页的数据
            totalRecord : 总记录数
        2个计算
            startIndex : 开始索引
            totalPage : 总页数
        private int pageNumber;
        private int pageSize;
        private int totalRecodr;
        private int startIndex;
        private int totalPage;
        private List<T> data;
        
        public int getStartIndex() {
            startIndex = (pageNumber - 1)*pageSize;
        }
        
        public int getTotalPage() {
            if(totalRecord % pageSize == 0) {
                totalPage = totalRecord / pageSize;
            }else {
                totalPage = totalRecord / pageSize + 1;
            }
            return totalPage;
        }
        
        public int getPageNumber() {
            return pageNumber;
        }
        
        public void setPageNumber(int pageNumber) {
            this.pageNumber = pageNumber;
        }
    }
    开发中真实案例--前五后四动态条 - 扩展 - 前四后五
        开发中应用:
    //循环的开始
        private int start;
    //循环结束
        private int end;
        
    //计算  开始  和  结束的数据
    private void jisuan() {
        //总页数有没有可能小于10
        //小于 10 不需要前四后五的动态条
        if(getTotalPage() < 10) {//必须调用getTotalPage() 因为totalPage需要提前计算
            start = 1;
            end = totalPage;//最后一页等于最大页数
            
        }else {
            //总页数一定大于10  需要前四后五动态条
            start = pageNumber - 4;
            end = pageNumber + 5;
            //如果start < 1 表示 当前1 2 3 4 总共显示10页
            if(start < 1) {
                start = 1;
                end = 10;
            }
            
            //如果end > totalPage 需要 计算start值
            if(end > totalPage) {
                end = totalPage;
                start = totalPage - 9;
            }
            
        }
        
    }
    
案例:代码体现

    public class ProductServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        try {
            //获得页面传递的参数 用来执行某段代码
            String method = request.getParameter("method");
            
            ProductService pService = new ProductService();
            CategoryService cService = new CategoryService();
            //根据页面功能执行某段特殊的代码
            if("findAll".equals(method)){
                /**
                 * 1.类型问题       两种解决方式:   1.正则 2.try
                 * 2.索引不可以是负数
                 */
                //1.获得 
                // 获得分页的数据 pageNumber 
                String pageNumberStr = request.getParameter("pageNumber");            
                int pageNumber = 1;
                try {
                    //如果是a 强转失败  赋值操作没有成功  pageNumber = 1 
                    pageNumber = Integer.valueOf(pageNumberStr);
                    if(pageNumber < 1 ){
                        pageNumber = 1;
                    }
                    
                } catch (Exception e) {
                }
                int pageSize = 2;
                //2.处理
                //List<Product> pList = pService.findByPage(pageNumber , pageSize);
                PageBean<Product> pageBean = pService.findByPage(pageNumber , pageSize);
                //3.响应
                //3.1 将数据存到request
                request.setAttribute("pageBean", pageBean);
                //3.2 请求转发给jsp 
                request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
                return;
            }
            
            //添加商品前查询分类的数据
            if("addProductUI".equals(method)){
                //1.获得
                //2.处理
                //2.1 调用service 查询出所有分类 返回值 List<Category>
                
                List<Category> cList = cService.findAll();
                //3.响应
                //3.1 将数据存到request
                request.setAttribute("cList", cList);
                //3.2 请求转发给product_add.jsp 
                request.getRequestDispatcher("/admin/product/product_add.jsp").forward(request, response);
                
                return;
            }
            
            //添加商品数据
            if("addProduct".equals(method)){
                
                //1.获得
                //1.1 获得map
                Map<String, String[]> map = request.getParameterMap();
                //1.2 创建Product
                Product product = new Product();
                //1.3 封装数据
                BeanUtils.populate(product, map);
                //1.4 手动封装数据
                product.setPid( UUID.randomUUID().toString().replace("-", "") );//主键会随机生成
                product.setPimage("products/1/c_0001.jpg");
                product.setPdate(new Date().toLocaleString());
                product.setIs_hot(0);//0表示非热门
                product.setPflag(0);//0表示未下架
                //2.处理
                //调用service保存
                pService.save(product);
                //3.响应
                //重定向到查询所有的案例
                response.sendRedirect(request.getContextPath() +"/ProductServlet?method=findAll");
                return;
                
            }
            
            //根据pid查询出商品的信息
            if("findByPid".equals(method)){
                //1.获得
                //获得pid的编号
                String pid = request.getParameter("pid");
                //2 处理
                //2.1 商品数据
                Product product = pService.findByPid(pid);
                //2.2 分类的数据
                List<Category> cList = cService.findAll();
                //3 响应
                request.setAttribute("product", product);
                request.setAttribute("cList", cList);
                request.getRequestDispatcher("/admin/product/product_edit.jsp").forward(request, response);
                return;
            }
            
            
            //修改商品数据的代码
            if("editProduct".equals(method)){
                //1.获得
                //1.1 获得map集合
                Map<String, String[]> map = request.getParameterMap();
                //1.2 创建product对象
                Product product = new Product();
                //1.3 封装
                BeanUtils.populate(product, map);
                //2.处理
                //2.1 调用service修改
                boolean flag = pService.update(product);
                //3.响应
                //3.1 重定向到查询所有的案例
                if(flag){
                    //成功
                    response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                }
                return ;
            }
            
            
            //根据pid删除商品
            if("deleteByPid".equals(method)){
                //1.获得
                //获得pid
                String pid = request.getParameter("pid");
                //2.处理
                int count = pService.deleteByPid(pid);
                //3.响应
                if(count > 0){
                    response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                }
                return;
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
    
    
    public static void main(String[] args) {
        System.out.println(UUID.randomUUID().toString().replace("-", ""));
        
    }

}

public class ProductService {
    
    
    /*public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
        //创建一个即将被返回的对象 PageBean<Product>
        PageBean<Product> pageBean = new PageBean<Product>();
        
        
        ProductDao dao = new ProductDao();
        
        //将pageNumber 转换成startIndex
        int startIndex = (pageNumber - 1) * pageSize;
        
        //查询当前页的2条数据
        List<Product> data = dao.findByPage( startIndex, pageSize);
        
        
        //查询总记录数
        int totalRecord = dao.findRecord();
        
        //计算总页数
        int totalPage = 0;
        if(totalRecord % pageSize == 0 ){
            totalPage = totalRecord / pageSize;
        }else{
            totalPage = totalRecord / pageSize + 1;
        }
        
        //赋值
        pageBean.setData(data);
        pageBean.setPageNumber(pageNumber);
        pageBean.setPageSize(pageSize);
        pageBean.setStartIndex(startIndex);
        pageBean.setTotalPage(totalPage);
        pageBean.setTotalRecord(totalRecord);
        return pageBean;
    }*/
    public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
        //创建一个即将被返回的对象 PageBean<Product>
        PageBean<Product> pageBean = new PageBean<Product>( pageNumber , pageSize);
        
        ProductDao dao = new ProductDao();
        
        //查询当前页的2条数据
        List<Product> data = dao.findByPage( pageBean.getStartIndex() , pageSize);
        
        //查询总记录数
        int totalRecord = dao.findRecord();
        
        //赋值
        pageBean.setData(data);
        pageBean.setTotalRecord(totalRecord);
        return pageBean;
    }

    public List<Product> findAll() throws SQLException {
        ProductDao dao = new ProductDao();
        return dao.findAll();
    }

    public void save(Product product) throws SQLException {
        ProductDao dao = new ProductDao();
         dao.save(product);
    }

    public Product findByPid(String pid) throws SQLException {
        ProductDao dao = new ProductDao();
        return  dao.findByPid(pid);
    }

    public boolean update(Product product) throws SQLException {
        ProductDao dao = new ProductDao();
        return  dao.update(product);
    }

    public int deleteByPid(String pid) throws SQLException {
        ProductDao dao = new ProductDao();
        return dao.deleteByPid(pid);
    }

    

}

package com.baidu.domain;

public class Product {

     /* 
      `pid` VARCHAR(32) NOT NULL,
      `pname` VARCHAR(50) DEFAULT NULL,        #商品名称
      `market_price` DOUBLE DEFAULT NULL,    #商场价
      
      `shop_price` DOUBLE DEFAULT NULL,        #商城价
      `pimage` VARCHAR(200) DEFAULT NULL,    #商品图片路径
      `pdate` DATE DEFAULT NULL,            #上架时间
      
      `is_hot` INT(11) DEFAULT NULL,        #是否热门:0=不热门,1=热门
      `pdesc` VARCHAR(255) DEFAULT NULL,    #商品描述
      `pflag` INT(11) DEFAULT 0,            #商品标记:0=未下架(默认值),1=已经下架
      
      `cid` VARCHAR(32) DEFAULT NULL,        #分类id*/
    
    private String pid;
    private String pname;
    private double market_price;
    
    private double shop_price;
    private String pimage;
    private String pdate;
    
    private int is_hot;
    private String pdesc;
    private int pflag;
    
    private String cid;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public double getMarket_price() {
        return market_price;
    }

    public void setMarket_price(double market_price) {
        this.market_price = market_price;
    }

    public double getShop_price() {
        return shop_price;
    }

    public void setShop_price(double shop_price) {
        this.shop_price = shop_price;
    }

    public String getPimage() {
        return pimage;
    }

    public void setPimage(String pimage) {
        this.pimage = pimage;
    }

    public String getPdate() {
        return pdate;
    }

    public void setPdate(String pdate) {
        this.pdate = pdate;
    }

    public int getIs_hot() {
        return is_hot;
    }

    public void setIs_hot(int is_hot) {
        this.is_hot = is_hot;
    }

    public String getPdesc() {
        return pdesc;
    }

    public void setPdesc(String pdesc) {
        this.pdesc = pdesc;
    }

    public int getPflag() {
        return pflag;
    }

    public void setPflag(int pflag) {
        this.pflag = pflag;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }
    
    
    
    
}

public class ProductDao {
    /**
     * 分页的dao
     * @param startIndex
     * @param pageSize
     * @return
     * @throws SQLException 
     */
    public List<Product> findByPage(int startIndex, int pageSize) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql =" select * from product limit ?,? ";
        Object [] params = {
                startIndex , pageSize
        };
        return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
    }
    /**
     * 计算总记录数
     * @return
     * @throws SQLException 
     */
    public int findRecord() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql =" select count(*) from product ";
        Object [] params = {
        };
        Object object = queryRunner.query(sql, new ScalarHandler(), params);
        return Integer.valueOf(object.toString());
    }    

    public List<Product> findAll() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql =" select * from product order by pdate desc ";
        
        Object [] params = {};
        
        return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
    }

    public void save(Product product) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql =" insert into product values(?,?,?,?,?,?,?,?,?,?) ";
        
        Object [] params = {
                product.getPid() , product.getPname() , product.getMarket_price() , 
                product.getShop_price() , product.getPimage() , product.getPdate() , 
                product.getIs_hot() , product.getPdesc() , product.getPflag() , 
                product.getCid()
        };
        
        queryRunner.update(sql, params);
    }

    public Product findByPid(String pid) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql =" select * from product where pid = ? ";
        
        Object [] params = {pid};
        
        return queryRunner.query(sql, new BeanHandler<Product>(Product.class), params);
    }

    public boolean update(Product product) throws SQLException {
        
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String  sql = " update product set pname = ? , shop_price = ? , pdesc = ? , cid = ? where pid = ?  ";
        
        Object [] params = {
                product.getPname() , product.getShop_price() , product.getPdesc() , 
                product.getCid() , product.getPid()
        };
        
        
        
        return queryRunner.update(sql, params) > 0 ;
    }

    public int deleteByPid(String pid) throws SQLException {

        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String  sql = " delete from product where pid = ?  ";
        
        Object [] params = {
                pid
        };
        
        
        
        return queryRunner.update(sql, params)  ;
    }
    
/**
 * 处理乱码的工具类
 *
 */
public class EncodingFilter implements Filter {


    public void destroy() {
        // TODO Auto-generated method stub
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        final HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        try {
            
            //处理post乱码
            request.setCharacterEncoding("utf-8");
            
            //处理响应
            response.setHeader("content-type", "text/html;charset=utf-8");
            
            //处理get乱码
            HttpServletRequest myRequest = (HttpServletRequest)Proxy.newProxyInstance(
                    EncodingFilter.class.getClassLoader(), 
                    request.getClass().getInterfaces(), 
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            
                            //可以对getParameter进行增强   get提交方式
                            
                            //1.判断是get请求方式
                            String requestMethod= request.getMethod();
                            if("GET".equalsIgnoreCase(requestMethod)){
                                //get提交  只对getParameter方法进行拦截
                                String methodName = method.getName();
                                if("getParameter".equals(methodName)){
                                    //get方式 并且 调用的getParameter方法
                                    //获得以前乱码 return 不乱码
                                    String tempValue = request.getParameter(args[0].toString());
                                    //如果没有获得数据 防止空指针
                                    if(tempValue == null){
                                        return null;
                                    }
                                    return new String(tempValue.getBytes("iso-8859-1"),"utf-8");
                                    
                                }
                            }
                            
                            //不需要增强
                            return method.invoke(request, args);
                        }
                    });
            
            //放行
            chain.doFilter(myRequest, response);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

jsp代码:
    <%-- 获得数据 并遍历 --%>
                                <c:forEach items="${pageBean.data}" var="product">
                                    <tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
                                        onmouseout="this.style.backgroundColor = '#fff';">
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            <input type="checkbox" name="" value="" />
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            <img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;width:150px" />
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.cid}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.pname}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.shop_price}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.pdesc}
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--编辑 --%>
                                            <a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
                                                <img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--查询 --%>
                                            <a href="../user/view.html?userID=15">
                                                <img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--删除  ctrl + q --%>
                                            <a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
                                                <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                            </a>
                                            
                                            
                                            <%--提示删除 --%>
                                            <a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
                                                <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                            
                                    </tr>
                                </c:forEach>
                                <%-- 获得数据 并遍历 --%>
                                <script>
                                    //javascript 需要在写在 header标签中
                                    function deleteByPid(pid){
                                        //alert(pid);
                                        //提示用户 
                                        var flag = confirm("您确定要删除信息吗?");
                                        if(flag){
                                            //确定删除
                                            //访问服务器删除的Servlet
                                            //修改地址栏 跳转路径  等效我们自己点击超链接
                                            location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
                                        }
                                    }
                                </script>
                        </table>
                    </td>
                </tr>
            </TBODY>
        </table>
        <!--分页  class="disabled"  class="active"-->
        <div style="width:1100px;margin:0 auto;margin-top:50px;">
            
            <ul class="pagination" style="text-align:center; margin-top:10px;">
                
                <%-- 如果当前页 等于 1 不需要再显示上一页  如果当前不等于1 显示 --%>
                <c:if test="${pageBean.pageNumber != 1}">
                    <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                    <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
                </c:if>
                
                <%-- 循环显示 所有的页数 --%>
                <c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
                    <li ${pageBean.pageNumber == num ? " class='active'"  : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
                </c:forEach>
                
                <%-- 如果当前页小于总页数 显示下一页 --%>
                <c:if test="${pageBean.pageNumber < pageBean.totalPage}">
                    <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
                    <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
                </c:if>
                
                
            </ul>
            
        </div>
        <!-- 分页结束=======================        -->


    
    条件查询:
        1: 先在首页上查询分类数据,并且遍历显示
            分析:
                select * from product where cid = ? and pname = ?;
                含有的可能性:
                    1.两者都有.
                    2.两者都没有.
                    3.有cid但没有pname
                    4.没有cid但有pname
                
                select count(*) from product where 1=1;
                伪代码:
                    SQL = " select * from product where 1=1 ";
                    if(cid != null) {
                        SQL += " and cid = ? "
                    }
                    if(pname != null) {
                        SQL += " and pname like ? "
                    }
        1: 修改表单 action属性,method属性,name属性,自定义的method判断逻辑.
        2: 调用Servlet
            a : 获得 cid和pname
            b : 处理 调用service 调用dao(重要)
            c : 响应 - 将数据存到request里,请求转发给product_list.jsp
        3.对jsp页面进行改造
        
    条件查询注意事项:
        1 . Dao的sql部分,拼接的问题,使用 where 1=1 解决了脏读、不可重复读、
        2 . Dao的参数拼接部分,使用List接收数据,最后将list转换成数组,解决.
        3 . 查询完以后将数据返回给页面,但还需要加上,用户传入后台的cid和pname;
    切记:条件查询 不可以 和 分页 同一个项目 但以后 条件查询需要和分页结合
        4 . 如果条件查询和分页需要做到同一个项目,需要处理参数问题.
        5 . PageBean 查询总记录数 --> 如果加入条件查询,查询总记录数时需要加上条件.
    
案例:代码体现
    public class ProductServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        try {
            //获得页面传递的参数 用来执行某段代码
            String method = request.getParameter("method");
            
            ProductService pService = new ProductService();
            CategoryService cService = new CategoryService();
            //根据页面功能执行某段特殊的代码
            if("findAll".equals(method)){
                //执行查询所有的代码
                //1.获得
                //1.31 获得cid
                String cid = request.getParameter("cid");
                //1.2 获得pname
                String pname = request.getParameter("pname");
                
                
                //2.处理
                List<Product> pList = pService.findAll( cid , pname );
                List<Category> cList = cService.findAll();
                //3.响应
                //3.1 将数据存到request
                request.setAttribute("pList", pList);
                request.setAttribute("cList", cList);
                
                request.setAttribute("cid", cid);
                request.setAttribute("pname", pname);
                
                //3.2 请求转发给jsp 
                request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
                return;
            }

public class ProductDao {
    /**
     * 条件查询
     * @param cid
     * @param pname
     * @return
     * @throws SQLException 
     */
    public List<Product> findAll(String cid, String pname) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String  sql = " select * from product where 1=1 ";
        
        //定义一个List  作用 用来保存参数 
        List<Object> paramList = new ArrayList<Object>();
        //cid判断
        if(cid != null && !"".equals(cid)){
            sql += " and cid = ?  ";
            paramList.add(cid);
        }
        //pname判断
        if(pname != null && !"".equals(pname)){
            sql += " and pname like ?  ";
            paramList.add("%"+pname+"%");
        }
        
        //数组的缺陷 长度固定  集合的长度不固定   集合最后转换成数组
        Object [] params = paramList.toArray();
        
        return queryRunner.query(sql,new BeanListHandler<Product>(Product.class), params);
        
    }
    
    <form action="${pageContext.request.contextPath}/ProductServlet" method="post">
                            <%--隐藏域 --%>
                            <input type="hidden" name="method" value="findAll"/>
                        
                            <table cellpadding="0" cellspacing="0" border="0" width="100%">
                                <tr>
                                    <td height="22" align="center" bgColor="#f5fafe" class="ta_01" style="width: 15%">
                                        分类
                                    </td>
                                    <td class="ta_01" bgColor="#ffffff" style="width: 30%">
                                        <select name="cid" class="form-control">
                                            <option value="">请选择</option>
                                            <c:forEach items="${cList}" var="category">
                                                <option ${category.cid==cid ? "selected" : ""} value="${category.cid}">${category.cname}</option>
                                            </c:forEach>
                                        </select>
                                    </td>
                                    <td height="22" align="center" bgColor="#f5fafe" class="ta_01" style="width: 15%">
                                        商品名称:
                                    </td>
                                    <td class="ta_01" bgColor="#ffffff">
                                        <input type="text" name="pname" size="15" value="${pname}" class="form-control"/>
                                    </td>
            
    
    批量删除:
        思想:
            前台两套方法:
                1 . 表单提交:将所有被选中的数据,的pid传入后台,后台执行批量删除.
                2 . 修改sql 修改成 sql=" delete from product where pid in (?) " 数据循环拼接 1,2,4
                3 . 开发中会使用jdbc jdbc当中有批处理,也可以处理批量任务.
        
            事务特性:
                A : 原子性;
                C : 一致性;
                I : 隔离性 : isolation 隔离会产生隔离问题
                D : 持久性.

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        try {
            //获得页面传递的参数 用来执行某段代码
            String method = request.getParameter("method");
            
            ProductService pService = new ProductService();
            CategoryService cService = new CategoryService();
            //根据pid删除商品
            if("deleteByPid".equals(method)){
                //1.获得
                //获得数组集合
                String[] pids = request.getParameterValues("pid");
                //2.处理
                int count = pService.deleteByPid(pids);
                //3.响应
                if(count > 0){
                    response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                }
                return;
            }
            
    <td align="center" width="6%">
                                    <input type="button" value="删除选中" onclick="deleteAll()">
                                    <script>
                                        function deleteAll(){
                                            //1.提示
                                            var flag = confirm("您确定要删除信息吗?");
                                            if(!flag){
                                                return ; 
                                            }
                                            //2.获得所有选中的pid 获得所有的数组 最后的格式 pid=1&pid=2&pid3..
                                            var pids = $("input[name='pid']:checked").serialize() ;
                                            //3.发送
                                            location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&"+pids;
                                        }
                                    </script>
                                </td>
                                <td align="center" width="15%">
                                    预览图
                                </td>
                                <td align="center" width="12%">
                                    商品分类
                                </td>
                                <td align="center" width="25%">
                                    商品名称
                                </td>
                                <td align="center" width="8%">
                                    商品价格
                                </td>
                                <td width="11%" align="center">
                                    描述
                                </td>
                                <td width="7%" align="center">
                                    编辑
                                </td>
                                <td width="7%" align="center">
                                    查看
                                </td>
                                <td width="7%" align="center">
                                    删除
                                </td>
                            </tr>
                                <%-- 获得数据 并遍历 --%>
                                <c:forEach items="${pList}" var="product">
                                    <tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
                                        onmouseout="this.style.backgroundColor = '#fff';">
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            <input type="checkbox" name="pid" value="${product.pid}" />
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            <img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;width:150px" />
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.cid}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.pname}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.shop_price}
                                        </td>
                                        <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                            ${product.pdesc}
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--编辑 --%>
                                            <a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
                                                <img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--查询 --%>
                                            <a href="../user/view.html?userID=15">
                                                <img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                        <td align="center" style="HEIGHT: 22px">
                                            <%--删除  ctrl + q --%>
                                            <a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
                                                <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                            </a>
                                            
                                            
                                            <%--提示删除 --%>
                                            <a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
                                                <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                            </a>
                                        </td>
                                            
                                    </tr>
                                </c:forEach>
                                <%-- 获得数据 并遍历 --%>
                                <script>
                                    //javascript 需要在写在 header标签中
                                    function deleteByPid(pid){
                                        //alert(pid);
                                        //提示用户 
                                        var flag = confirm("您确定要删除信息吗?");
                                        if(flag){
                                            //确定删除
                                            //访问服务器删除的Servlet
                                            //修改地址栏 跳转路径  等效我们自己点击超链接
                                            location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
                                        }
                                    }
                                </script>
                        </table>
                    </td>
                </tr>
            </TBODJY>
        </table>
        
数据库开启手动提交以后,只要commit以后,会改成自动提交.查一下是否改成了自动提交

 

点赞