增删改查

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"/>

原文地址:https://www.cnblogs.com/shan1393/p/8926719.html