文档章节

增删改查

o
 osc_x4h57ch8
发布于 2018/04/24 10:36
字数 2253
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如何防止单击按钮时对话框关闭 - How to prevent a dialog from closing when a button is clicked

问题: I have a dialog with EditText for input. 我有一个使用EditText输入的对话框。 When I click the "yes" button on dialog, it will validate the input and then close the dialog.......

富含淀粉
19分钟前
7
0
访问者模式Visitor

一 概述 场景:通常来说,用于封装数据所用到的pojo类,其只包含get、set,对应的业务逻辑是在Service上完成的;但如果出现多个pojo类都共用一套逻辑时,则应该考虑将逻辑进行抽象,不同类型...

小明不觉小
43分钟前
5
0
jQuery Ajax错误处理,显示自定义异常消息 - jQuery Ajax error handling, show custom exception messages

问题: Is there some way I can show custom exception messages as an alert in my jQuery AJAX error message? 有没有什么方法可以在我的jQuery AJAX错误消息中显示自定义异常消息作为警报...

法国红酒甜
49分钟前
28
0
告别传统机房:3D 机房数据可视化实现智能化与VR技术的新碰撞

前言 随着各行业对计算机依赖性的日益提高,计算机信息系统的发展使得作为其网络设备、主机服务器、数据存储设备、网络安全设备等核心设备存放地的计算机机房日益显现出它的重要地位,而机房...

xhload3d
昨天
51
0
spring源码解析-xml配置文件读取

整个 XML配置文件读取的大致流程如下: 通过继承自AbstractBeanDefinitionReader中的方法,来使用ResourLoader将资源文件路径转换为对应的Resource文件(读取资源文件并将其转为Resource) ...

wc_飞豆
昨天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部