JavaWeb学习-案例练习-图书管理后台-8-多条件查询实现

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

这篇来介绍,多条件查询的实现过程,多条件查询其实就是思考如何去写这个sql语句,进一步说就是如何根据多个条件去拼接sql语句。

1.思路分析

就是上面这个需求,上面有四个条件,也就是where字句最多需要四个拼接一起去查询,还要考虑,四个都为空的情况。下面来看看分析思路。

1.全部为空,也就是全量查询,传入的sql 就是 “SELECT * FROM book”

2.假如根据商品名称查询,那就是“SELECT * FROM book WHERE name=xxx”

重点来了,四个条件如何去拼接,如果为空,那么这个条件就不拼接。下面的伪代码看起来是这样的。
 

String sql = "select * from book where"; // 定义一个基础的sql查询语句
List list = new ArrayList();
if(!"".equal(name)){
    sql +=" and name=?";//注意and 前面必须有一个空格
    list.add(name);
}

if(!"".equal(category)){
    sql +=" and name=?"; //注意and 前面必须有一个空格
    list.add(category);
}

//Dao层SQL语句这么写
qr.query(sql, list.toChary())

上面是两个条件的判断,但是有一个问题,如果都为空,也就是下面这四个if判断不走,就执行初始化的sql查询,就会报错,因为没有给出有返回值的where条件。所以,这个初始sql还需要修改一下。

String sql = "select * from book where 1=1"; // 定义一个基础的sql查询语句

2.代码实现

首先在list.jsp中查询表单这个地方,设置跳转到哪一个servlet,例如我们跳转到一个searchBooksServlet

<form id="Form1" name="Form1"
		action="${pageContext.request.contextPath}/searchBooksServlet"
		method="post">
		<table cellSpacing="1" cellPadding="0" width="100%" align="center"
			bgColor="#f5fafe" border="0">
			<TBODY>
				<tr>
					<td class="ta_01" align="center" bgColor="#afd1f3"><strong>查
							询 条 件</strong>
					</td>
				</tr>
				<tr>
					<td>
						<table cellpadding="0" cellspacing="0" border="0" width="100%">
							<tr>
								<td height="22" align="center" bgColor="#f5fafe" class="ta_01">
									商品编号</td>

上面代码中action=“.../searchBooksServlet”就是这里需要改的代码

2.1 创建一个空的SearchBooksServlet.java类

2.3 Dao层

BookDao接口中添加一个方法。

public List<Book> searchBooks(String id, String category, String name, String minprice, String maxprice) throws SQLException;

BookDaoImpl.java添加这个方法的具体实现

public List<Book> searchBooks(String id, String category, String name, String minprice, String maxprice) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		String sql = "select * from book where 1=1";
		List list = new ArrayList();
		
		if(!"".equals(id.trim())) {
			sql += " and id like ?"; //因为id是随机UUID,不好记住,所以这里模糊匹配
			list.add("%"+id.trim()+"%"); // %abc% 这个是like的语法,这里需要拼接上这个%
		}
		if(!"".equals(category.trim())) {
			sql += " and category=?";
			list.add(category.trim());
		}
		if(!"".equals(name.trim())) {
			sql += " and name like ?";
			list.add("%"+name.trim()+"%");
		}
		if(!"".equals(minprice.trim())) {
			sql += " and price >?";
			list.add(minprice.trim());
		}
		if(!"".equals(maxprice.trim())) {
			sql += " and price <?";
			list.add(maxprice.trim());
		}
		
		return qr.query(sql, new BeanListHandler<Book>(Book.class),list.toArray());
	}

2.4 Service层

BookService接口文件添加以下方法

public List<Book> searchBooks(String id, String category, String name, String minprice, String maxprice);

BookServiceImpl.java添加具体实现方法

    public List<Book> searchBooks(String id, String category, String name, String minprice, String maxprice) {
		try {
			return bd.searchBooks(id,category,name,minprice,maxprice);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

2.5 Servlet代码

package com.anthony.web.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.anthony.domain.Book;
import com.anthony.service.BookService;
import com.anthony.service.BookServiceImpl;

public class SearchBooksServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取表单数据
		request.setCharacterEncoding("UTF-8");
		String id = request.getParameter("id");
		String category = request.getParameter("category");
		String name = request.getParameter("name");
		String minprice = request.getParameter("minprice");
		String maxprice = request.getParameter("maxprice");
		
		//调用业务逻辑
		BookService bs = new BookServiceImpl();
		List<Book> list = bs.searchBooks(id,category,name,minprice,maxprice);
		//处理分发转向
		request.setAttribute("books", list);
		request.getRequestDispatcher("/admin/products/list.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

部署tomcat之后,就可以进行测试了。

我这边四个条件都依次尝试过查询,都可以实现查询结果,这个当前唯一的不好就是,查询之后,用户输入查询条件没有回显在页面。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/94361578