admin管理员组文章数量:1033077
JavaWeb后端入门11—条件查询
1.1 应用场景
商品列表页面加一个查询功能,条件有商品名称、是否热门、商品类别,其中是否热门和商品类别可以选择不限。点击查询后输出符合条件的商品列表。
Dao里面的分类查询是核心,也是最难和最有技巧的地方
1.2 前端界面
查询按钮处的表单:
代码语言:javascript代码运行次数:0运行复制<form id="Form1" name="Form1" action="${pageContext.request.contextPath}/SearchProductListServlet" method="post">
<%--查询功能的实现 --%>
商品名称: <input type="text" name="pname">
是否热门:<select name="is_hot">
<option value="2">不限
<option value="0">否
<option value="1">是
</select>
商品类别:<select name="cid">
<option value="">不限
<c:forEach items="${categoryList }" var="category">
<option value="${category.cid }">${categoryame }
</c:forEach>
</select>
<input type="submit" value="搜索" style="margin-right: 200px;">
</form>
1.3 建立一个VO实体层,用于存放查询信息
package cn.wuter.vo;
public class Condition {
private String pname;
private int is_hot;
private String cid;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getIs_hot() {
return is_hot;
}
public void setIs_hot(int is_hot) {
this.is_hot = is_hot;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
}
我在建立数据库的时候给自己买了一个坑,这个is_hot被我设置成了int类型,待会儿Dao层会很麻烦!
1.4 Servlet层,用map接受数据存入vo
代码语言:javascript代码运行次数:0运行复制package cn.wuter.web;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apachemons.beanutils.BeanUtils;
import cn.wuter.domain.Product;
import cn.wuter.service.SearchProductListService;
import cn.wuter.vo.Condition;
/**
* 根据条件查询商品列表的Servlet
*/
public class SearchProductListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取数据
request.setCharacterEncoding("UTF-8");
Map<String, String[]> map = request.getParameterMap();
System.out.println("SearchProductListServlet层");
//2.封装数据到vo层的实体中
Condition condition = new Condition();
try {
BeanUtils.populate(condition, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//3.传递数据及请求给SearchProductListService
SearchProductListService service = new SearchProductListService();
List<Product> productList = null;
try {
productList = service.findProductListByCondition(condition);
} catch (SQLException e) {
e.printStackTrace();
}
//4.保存数据
request.setAttribute("productList", productList);
//5.页面跳转
request.getRequestDispatcher("admin/product/list.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.5 Service层,传递实体及请求
代码语言:javascript代码运行次数:0运行复制package cn.wuter.service;
import java.sql.SQLException;
import java.util.List;
import cn.wuter.dao.SearchProductListDao;
import cn.wuter.domain.Product;
import cn.wuter.vo.Condition;
public class SearchProductListService {
//根据条件查询商品列表的Service
public List<Product> findProductListByCondition(Condition condition) throws SQLException {
SearchProductListDao dao = new SearchProductListDao();
List<Product> productList = dao.findProductListByCondition(condition);
return productList;
}
}
1.6 Dao层,核心/难点
- 难点1:如何正确书写sql?因为涉及到这三个条件有可能为空(不限),如果是不限的话,在where xx =?中就不能加入这个语句
- 方法:拼接,三个if并联
先定义String sql = select * from product where 1=1
因为后面每一条都是 and xx = ?所以要加入where 1=1这个恒成立条件
- 难点2:如何正确向query方法传参?sql语句不通,传入的参数就不同
- 方法:用一个list作为容器接收数据
package cn.wuter.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apachemons.dbutils.QueryRunner;
import org.apachemons.dbutils.handlers.BeanListHandler;
import com.mchange.v2.c3p0.impl.NewPooledConnection;
import cn.wuter.domain.Product;
import cn.wuter.utils.JDBCUtils;
import cn.wuter.vo.Condition;
public class SearchProductListDao {
public List<Product> findProductListByCondition(Condition condition) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from product where 1=1";
//定义一个存储实际参数的容器
List<Object> list = new ArrayList<Object>();
//trim是去掉空字符串
if (condition.getPname() != null && !condition.getPname().trim().equals("")) {
sql += " and pname like ? ";
list.add("%"+condition.getPname().trim()+"%");
}
if (condition.getIs_hot() != 2) {
sql += " and is_hot = ? ";
list.add(condition.getIs_hot());
}
if (condition.getCid() != null && !condition.getCid().trim().equals("")) {
sql += " and cid = ? ";
list.add(condition.getCid().trim());
}
System.out.println(list);
System.out.println(list.toArray());
List<Product> productList = queryRunner.query(sql, new BeanListHandler<Product>(Product.class),list.toArray() );
return productList;
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-28 ,如有侵权请联系 cloudcommunity@tencent 删除容器import后端入门数据JavaWeb后端入门11—条件查询
1.1 应用场景
商品列表页面加一个查询功能,条件有商品名称、是否热门、商品类别,其中是否热门和商品类别可以选择不限。点击查询后输出符合条件的商品列表。
Dao里面的分类查询是核心,也是最难和最有技巧的地方
1.2 前端界面
查询按钮处的表单:
代码语言:javascript代码运行次数:0运行复制<form id="Form1" name="Form1" action="${pageContext.request.contextPath}/SearchProductListServlet" method="post">
<%--查询功能的实现 --%>
商品名称: <input type="text" name="pname">
是否热门:<select name="is_hot">
<option value="2">不限
<option value="0">否
<option value="1">是
</select>
商品类别:<select name="cid">
<option value="">不限
<c:forEach items="${categoryList }" var="category">
<option value="${category.cid }">${categoryame }
</c:forEach>
</select>
<input type="submit" value="搜索" style="margin-right: 200px;">
</form>
1.3 建立一个VO实体层,用于存放查询信息
package cn.wuter.vo;
public class Condition {
private String pname;
private int is_hot;
private String cid;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getIs_hot() {
return is_hot;
}
public void setIs_hot(int is_hot) {
this.is_hot = is_hot;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
}
我在建立数据库的时候给自己买了一个坑,这个is_hot被我设置成了int类型,待会儿Dao层会很麻烦!
1.4 Servlet层,用map接受数据存入vo
代码语言:javascript代码运行次数:0运行复制package cn.wuter.web;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apachemons.beanutils.BeanUtils;
import cn.wuter.domain.Product;
import cn.wuter.service.SearchProductListService;
import cn.wuter.vo.Condition;
/**
* 根据条件查询商品列表的Servlet
*/
public class SearchProductListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取数据
request.setCharacterEncoding("UTF-8");
Map<String, String[]> map = request.getParameterMap();
System.out.println("SearchProductListServlet层");
//2.封装数据到vo层的实体中
Condition condition = new Condition();
try {
BeanUtils.populate(condition, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//3.传递数据及请求给SearchProductListService
SearchProductListService service = new SearchProductListService();
List<Product> productList = null;
try {
productList = service.findProductListByCondition(condition);
} catch (SQLException e) {
e.printStackTrace();
}
//4.保存数据
request.setAttribute("productList", productList);
//5.页面跳转
request.getRequestDispatcher("admin/product/list.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.5 Service层,传递实体及请求
代码语言:javascript代码运行次数:0运行复制package cn.wuter.service;
import java.sql.SQLException;
import java.util.List;
import cn.wuter.dao.SearchProductListDao;
import cn.wuter.domain.Product;
import cn.wuter.vo.Condition;
public class SearchProductListService {
//根据条件查询商品列表的Service
public List<Product> findProductListByCondition(Condition condition) throws SQLException {
SearchProductListDao dao = new SearchProductListDao();
List<Product> productList = dao.findProductListByCondition(condition);
return productList;
}
}
1.6 Dao层,核心/难点
- 难点1:如何正确书写sql?因为涉及到这三个条件有可能为空(不限),如果是不限的话,在where xx =?中就不能加入这个语句
- 方法:拼接,三个if并联
先定义String sql = select * from product where 1=1
因为后面每一条都是 and xx = ?所以要加入where 1=1这个恒成立条件
- 难点2:如何正确向query方法传参?sql语句不通,传入的参数就不同
- 方法:用一个list作为容器接收数据
package cn.wuter.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apachemons.dbutils.QueryRunner;
import org.apachemons.dbutils.handlers.BeanListHandler;
import com.mchange.v2.c3p0.impl.NewPooledConnection;
import cn.wuter.domain.Product;
import cn.wuter.utils.JDBCUtils;
import cn.wuter.vo.Condition;
public class SearchProductListDao {
public List<Product> findProductListByCondition(Condition condition) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from product where 1=1";
//定义一个存储实际参数的容器
List<Object> list = new ArrayList<Object>();
//trim是去掉空字符串
if (condition.getPname() != null && !condition.getPname().trim().equals("")) {
sql += " and pname like ? ";
list.add("%"+condition.getPname().trim()+"%");
}
if (condition.getIs_hot() != 2) {
sql += " and is_hot = ? ";
list.add(condition.getIs_hot());
}
if (condition.getCid() != null && !condition.getCid().trim().equals("")) {
sql += " and cid = ? ";
list.add(condition.getCid().trim());
}
System.out.println(list);
System.out.println(list.toArray());
List<Product> productList = queryRunner.query(sql, new BeanListHandler<Product>(Product.class),list.toArray() );
return productList;
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-28 ,如有侵权请联系 cloudcommunity@tencent 删除容器import后端入门数据本文标签: JavaWeb后端入门11条件查询
版权声明:本文标题:JavaWeb后端入门11—条件查询 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747999667a2239772.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论