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实体层,用于存放查询信息

代码语言:javascript代码运行次数:0运行复制
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作为容器接收数据
代码语言:javascript代码运行次数:0运行复制
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实体层,用于存放查询信息

代码语言:javascript代码运行次数:0运行复制
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作为容器接收数据
代码语言:javascript代码运行次数:0运行复制
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条件查询