这篇来介绍,多条件查询的实现过程,多条件查询其实就是思考如何去写这个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之后,就可以进行测试了。
我这边四个条件都依次尝试过查询,都可以实现查询结果,这个当前唯一的不好就是,查询之后,用户输入查询条件没有回显在页面。