zoukankan      html  css  js  c++  java
  • 增删改查

    JDBC案例
    今日内容介绍
    案例:删除选中商品
    案例:条件查询
    案例:分页查询

    今日内容学习目标
    删除选中商品
    条件查询
    分页查询


    第1章案例:删除选中商品

    1.1案例分析


    1.2案例实现
    步骤1:修改jsp,完善checkbox,name为pid,value为商品id

    <input type="checkbox" name="pid" value="${product.pid}" />
    步骤2:编写js代码,获得所有的pid
    添加id属性:<a id="deleteAllId" href="javascript:void(0)">删除选中</a>
    <script type="text/javascript">
    $(function(){
    //绑定点击事件
    $("#deleteAllId").click(function(){
    //所有选中的checkbox
    var all = $("input[name='pid']:checked");
    if(all.length == 0){
    alert("请选择需要上传的商品");
    return false;
    }
    //
    if(window.confirm("您确定要删除所选"+all.length+"个商品吗?")){
    //获得所有的id串
    //注:serialize()为jquery的方法 将元素序列化成 id=xx&id=yy的格式
    var ids = all.serialize();
    location.href="${pageContext.request.contextPath}/productDeleteServlet?" + ids;
    } else {
    $("input[name='pid']").removeProp("checked");
    }
    });
    });
    </script>

    步骤3:编写servlet
    public class ProductDeleteAllServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1 获得所有的id
    String[] pids = request.getParameterValues("pid");
    //2 删除
    ProductService productService = new ProductService();
    productService.deleteAll(pids);

    //3重定向查询所有
    response.sendRedirect(request.getContextPath() + "/productFindAllServlet");
    }

    步骤4:编写service
    /**
    * 删除所有
    * @param pids
    */
    public void deleteAll(String... pids) {
    productDao.delete(pids);
    }

    步骤5:编写dao
    /**
    * 删除所有
    * @param pids
    */
    public void deleteAll(String... pids) {
    try {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    //删除sql语句
    String sql = "delete from product where pid = ?";
    //将所有的pid拼凑一个二维数组,列表示id,行表示个数
    Object[][] params = new Object[pids.length][];
    for (int i = 0; i < pids.length; i++) {
    params[i] = new Object[]{pids[i]};
    }
    queryRunner.batch(sql, params);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }


    第2章案例:分页查询
    2.1案例介绍
    实际开发中,条件查询时非常常见的一种功能,上一个案例中我们已经完成。接着我们再来学习另一种也非常常见的功能:分页查询。


    2.2相关知识:sql分页
    格式:select * from 表 limit ?,?;
    参数1:开始索引 startIndex ,默认值:0。必须是正数。
    参数2:每页显示个数 pageSize
    例如:
    select * from products limit 0,5; #第一页,每页显示5条。
    select * from products limit 5,5; #第二页,每页显示5条。
    select * from products limit 10,5; #第三页,每页显示5条。
    select * from products limit ?,5; #第pageNumber页,每页显示5条。
    startIndex = (pageNumber - 1) * pageSize;

    2.3案例分析


    2.4案例实现
    步骤1:编写PageBean,提供构造方法,统一算法的编写。

    public class PageBean<T> {
    private int pageNumber; //当前页(浏览器传递)
    private int pageSize; //每页显示个数(固定值,也可以是浏览器传递)
    private int totalRecord; //总记录数(数据库查询)
    private int totalPage; //总分页数
    private int startIndex; //开始索引
    private List<T> data; //分页数据(数据库查询)

    /**
    * 为了约束使用者,必须传递两个参数,不提供无参构造
    * @param pageNumber
    * @param pageSize
    */
    public PageBean(int pageNumber, int pageSize) {
    super();
    this.pageNumber = pageNumber;
    this.pageSize = pageSize;


    }
    public int getStartIndex() {
    //开始索引计算
    startIndex = (pageNumber - 1) * pageSize;
    return startIndex;
    }
    public int getTotalPage() {
    //总页数计算
    if(totalRecord % pageSize == 0){
    //整除
    totalPage = totalRecord / pageSize ;
    } else {
    //有余数 + 1 (半页)
    totalPage = totalRecord / pageSize + 1;
    }

    return totalPage;
    }
    //其他getter和setter方法省略

    步骤2:确定入口
    http://localhost:8080/day14_page/productFindAllServlet?pageNumber=2


    步骤3:编写servlet,获得参数
    public class ProductFindAllServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1 获得分页参数
    String pageNumberStr = request.getParameter("pageNumber");
    Integer pageNumber = 1 ;//处理没有传递参数的情况
    try {
    pageNumber = Integer.parseInt(pageNumberStr);
    } catch (Exception e) {
    }
    Integer pageSize = 2;
    //固定值,Integer.parseInt(request.getParameter("pageSize"));

    //2 通知service,查询所有商品
    ProductService productService = new ProductService();
    PageBean<Product> pageBean = productService.findAll(pageNumber,pageSize);

    //3 选择jsp
    //3.1 将查询结果存放在request作用域
    request.setAttribute("pageBean", pageBean);
    //3.2 请求转发
    request.getRequestDispatcher("/admin/product/product_list.jsp")
    .forward(request, response);
    }

    步骤4:编写service,进行分页查询,将所有的数据封装到PageBean中。
    /**
    * 查询所有,分页
    * @return
    */
    public PageBean<Product> findAll(int pageNumber , int pageSize){
    //1 总分页数、开始索引,已经在PageBean中处理了
    PageBean<Product> pageBean = new PageBean<Product>(pageNumber, pageSize);

    //2 查询总记录数
    int totalRecord = productDao.getTotalRecord();
    //将总记录数封装到pageBean中
    pageBean.setTotalRecord(totalRecord );

    //3 查询分页数据
    List<Product> data =
    productDao.findAll(pageBean.getStartIndex(),pageBean.getPageSize());
    // * 将分页数据封装到PageBean中
    pageBean.setData(data);

    //4 返回封装好的数据
    return pageBean;
    }

    步骤5:编写dao,查询总记录数和分页数据
    /**
    * 查询总记录数
    * @return
    */
    public int getTotalRecord() {
    try {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select count(*) from product";
    Object[] params = {};
    Long numLong = (Long) queryRunner.query(sql, new ScalarHandler(), params);
    return numLong.intValue();
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }

    /**
    * 分页查询所有
    * @return
    */
    public List<Product> findAll(int startIndex, int pageSize) {
    try {
    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);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }


    步骤6:修改jsp页面,显示分页数据
    位置:/day14_page/WebContent/admin/product/product_list.jsp


    步骤7:显示分页信息

    第${ pageBean.pageNumber }/${ pageBean.totalPage }页&nbsp;&nbsp;
    总记录数:${pageBean.totalRecord }&nbsp;每页显示:${ pageBean.pageSize }&nbsp;&nbsp;
    <c:if test="${ pageBean.pageNumber gt 1 }">
    <a href="${ pageContext.request.contextPath }/productListPageServlet?pageNumber=1">[首页]</a> | &nbsp;
    <a href="${ pageContext.request.contextPath }/productListPageServlet?pageNumber=${pageBean.pageNumber-1}">[上一页]</a>|&nbsp;
    </c:if>
    &nbsp;
    <c:forEach var="i" begin="1" end="${pageBean.totalPage }">
    <c:if test="${ pageBean.pageNumber == i }">
    ${ i }
    </c:if>
    <c:if test="${ pageBean.pageNumber != i }">
    <a href="${ pageContext.request.contextPath }/productListPageServlet?pageNumber=${ i}">${ i }</a>
    </c:if>
    </c:forEach>
    &nbsp;
    <c:if test="${ pageBean.pageNumber lt pageBean.totalPage }">
    <a href="${ pageContext.request.contextPath }/productListPageServlet?pageNumber=${pageBean.pageNumber+1}">[下一页]</a>|&nbsp;
    <a href="${ pageContext.request.contextPath }/productListPageServlet?pageNumber=${pageBean.totalPage}">[尾页]</a>
    </c:if>


    第3章案例:条件查询
    3.1案例介绍
    我们已经完成了“查询所有商品”功能,如果我们希望从所有数据中筛选出需要的部分数据,会发现通过肉眼比较困难,且没有必要。在开发中,我们采用“条件查询”来解决此类问题。

    3.2案例分析
    “条件查询”和“查询所有”,两个功能非常相似,不同出就在条件的筛选上,通过页面将分类和商品名称传递给服务器,服务器获得查询条件,然后通知service拼凑sql语句进行具体查询。
    我们发现如果要完成“条件查询”,必须在之前的“查询所有”时,查询所有的分类,从而可以进行条件的选择。


    3.3案例实现
    步骤2:确定JavaBean,在商品Product对象中,使用的“category_id”字段存放分类id。

    步骤2:修改Servlet,查询所有时,查询所有分类(条件查询使用)
    修改:/day14_condition/src/cn/itcast/web/servlet/ProductFindAllServlet.java

    public class ProductFindAllServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1

    //2.1 通知service,查询所有商品
    ProductService productService = new ProductService();
    List<Product> allProduct = productService.findAll();
    //2.2 通过分类service,查询所有分类
    CategoryService categoryService = new CategoryService();
    List<Category> allCategory = categoryService.findAll();

    //3 选择jsp
    //3.1 将查询结果,所有商品,存放在request作用域
    request.setAttribute("allProduct", allProduct);
    //3.2 将查询结果,所有分类,存放在request作用域
    request.setAttribute("allCategory", allCategory);
    //3.3 请求转发
    request.getRequestDispatcher("/admin/product/product_list.jsp")
    .forward(request, response);

    }

    步骤3:修改product.jsp,显示所有分类
    修改:/day14_condition/WebContent/admin/product/product_list.jsp

    <c:forEach items="${allCategory}" var="category">
    <option value="${category.cid}">${category.cname}</option>
    </c:forEach>

    步骤4:修改product.jsp,完善表单。概览如下:
    <form action="${pageContext.request.contextPath}/productFindAllServlet" method="post">
    分类 <select name="category_id" class="form-control">
    商品名称:<input type="text" name="pname" size="15" class="form-control"/>
    <button type="submit" value="查询" class="button_view">查询</button>

    步骤5:完善servlet,获得查询条件,并封装到javabean,然后传递给service
    位置:/day14_condition/src/cn/itcast/web/servlet/ProductFindAllServlet.java

    此时ProductService的findAll(product) 不存在所以抛异常。
    public class ProductFindAllServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1 获得请求参数
    Product product = MyBeanUtils.populate(Product.class, request.getParameterMap());

    //2.1 通知service,查询所有商品
    ProductService productService = new ProductService();
    List<Product> allProduct = productService.findAll(product);
    //2.2 ...省略
    步骤6:完善service,接收条件,并拼凑sql查询条件。
    /**
    * 查询所有(含条件)
    * @return
    */
    public List<Product> findAll(Product product) throws SQLException {
    return productDao.findAll(product);
    }

    步骤7:完善dao,使用条件和参数

    /**
    * 查询所有
    * @return
    */
    public List<Product> findAll(Product product) throws SQLException {
    //1.1 拼凑sql语句,格式:and 属性 符号 ?
    StringBuilder builder = new StringBuilder();
    //1.2 拼凑实际参数。实际参数可重复、参数需要顺序,所以选择List集合
    List<Object> paramsList = new ArrayList<Object>();

    //2.1 分类不为空 ,添加分类条件
    if(product.getCategory_id() != null && !"".equals(product.getCategory_id())){
    builder.append(" and category_id = ? ");
    paramsList.add(product.getCategory_id());
    }

    //2.2 商品名不为空,添加商品名条件
    if(product.getPname() != null && !"".equals(product.getPname())){
    builder.append(" and pname like ? ");
    //商品名需要模糊查询即可,需要手动的添加%
    paramsList.add("%"+product.getPname()+"%");
    }

    //3 转换成需要的类型
    String condition = builder.toString();
    Object[] params = paramsList.toArray();

    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from product where 1=1 " + condition;
    return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
    }

    3.4查询条件回显


    步骤1:修改servlet,将封装好的查询条件,添加到request作用域
    /day14_condition/src/cn/itcast/web/servlet/ProductFindAllServlet.java


    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1 获得请求参数
    Product product = MyBeanUtils.populate(Product.class, request.getParameterMap());

    //2.1 通知service,查询所有商品
    ProductService productService = new ProductService();
    List<Product> allProduct = productService.findAll(product);
    //2.2 通过分类service,查询所有分类
    CategoryService categoryService = new CategoryService();
    List<Category> allCategory = categoryService.findAll();

    //3 选择jsp
    //3.1 将查询结果,所有商品,存放在request作用域
    request.setAttribute("allProduct", allProduct);
    //3.2 将查询结果,所有分类,存放在request作用域
    request.setAttribute("allCategory", allCategory);
    //3.3 存放条件
    request.setAttribute("product", product);
    //3.4 请求转发
    request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);

    }

    步骤2:使用“条件product”进行标签回显
    /day14_condition/WebContent/admin/product/product_list.jsp
    分类
    <c:forEach items="${allCategory}" var="category">
    <option value="${category.cid}"
    ${product.category_id == category.cid ? "selected='selected'" : ""} >
    ${category.cname}
    </option>
    </c:forEach>
    商品名称:
    <input type="text" name="pname" size="15" value="${product.pname}" class="form-control"/>

  • 相关阅读:
    SpringBoot详细研究-01基础
    JDK1.8快速入门
    海外酒店业务学习
    NOSQL快速入门
    移动前端技术快速入门
    Spring快速入门
    Java基础组件快速入门
    JavaWeb快速入门
    TLS 与 python thread local
    python 类修饰器
  • 原文地址:https://www.cnblogs.com/shan1393/p/8926719.html
Copyright © 2011-2022 走看看