高级查询

高级查询后台操作步骤:

1)在ProductDAO接口中编写高级查询的方法

public interface ProductDAO {
	/**
	 * 高级查询
	 * @param name              商品名称:productName LIKE '%name值%'
	 * @param minSalePrice      最低价格:salePrice>minPrice
	 * @param maxSalePrice      最高价格:salePrice<maxPrice
	 * @return
	 */
	List<Product> query(String name,BigDecimal minSalePrice,BigDecimal maxSalePrice);
	
}

2)

public class ProductDAOImpl implements ProductDAO{

	public List<Product> query(String name, BigDecimal minSalePrice, BigDecimal maxSalePrice) {
		StringBuilder sql=new StringBuilder(80);
		sql.append("SELECT * FROM product WHERE 1=1 ");
		//封装占位符参数
		List<Object> parameters=new ArrayList<>();
		//商品名称
		if(StringUtils.isNoneBlank(name)) {
			sql.append("AND productName LIKE ?");
			parameters.add("%"+name+"%");
		}
		//最低价格
		if(minSalePrice!=null) {
			sql.append("AND salePrice>=?");
			parameters.add(minSalePrice);
		}
		//最高价格
		if(maxSalePrice!=null) {
			sql.append("AND salePrice<=?");
			parameters.add(maxSalePrice);
		}
		System.out.println("SQL="+sql);
		System.out.println("参数="+parameters);
		return JdbcTemplate.query(sql.toString(), new BeanListHandler<>(Product.class), parameters.toArray());
	}

 

@Test
	public void testQuery() {
			List<Product> list=dao.query("鼠", new BigDecimal("50"),null);
			System.out.println(list.size());
			for(Product p:list) {
				System.out.println(p.getId()+p.getBrand());
			}
		
	}

缺陷:如果查询条件过多,此时参数就很多-->把多个查询条件封装到查询对象QueryObject中

 

缺陷:在上述查询过程中,为了避免判断哪一个条件是第一个,而使用了where 1=1

          但是使用where 1=1会影响性能,因为不能使用索引来查询了

          可以手动判断但是可以使用一种更方便的:使用Apache common-lang组件中的StringUtils.join方法,

把集合中每一个元素使用特定的字符串给连接起来。

public class ProductQueryObject {
	private String name;
	private BigDecimal minSalePrice;
	private BigDecimal maxSalePrice;
	public ProductQueryObject(String name, BigDecimal minSalePrice, BigDecimal maxSalePrice) {
		this.name = name;
		this.minSalePrice = minSalePrice;
		this.maxSalePrice = maxSalePrice;
	}
	public ProductQueryObject() {
	
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public BigDecimal getMinSalePrice() {
		return minSalePrice;
	}
	public void setMinSalePrice(BigDecimal minSalePrice) {
		this.minSalePrice = minSalePrice;
	}
	public BigDecimal getMaxSalePrice() {
		return maxSalePrice;
	}
	public void setMaxSalePrice(BigDecimal maxSalePrice) {
		this.maxSalePrice = maxSalePrice;
	}
	//参数集合
	private List<Object> parameters=new ArrayList<>();
	//查询条件集合
	private List<String> conditions=new ArrayList<>();
	//返回查询条件
	public String getQuery() {
		StringBuilder sql=new StringBuilder(80);
		//商品名称
		if(StringUtils.isNotBlank(name)) {
			conditions.add("productName LIKE ?");
			parameters.add("%"+name+"%");
		}
		//最低价格
		if(minSalePrice!=null) {
			conditions.add("salePrice>=?");
			parameters.add(minSalePrice);
		}
		//最高价格
		if(maxSalePrice!=null) {
			conditions.add("SalePrice<=?");
			parameters.add(maxSalePrice);
		}
		if(conditions.size()==0) {
			return "";
		}
		String queryString=StringUtils.join(conditions.toArray(), " AND ");
		return sql.append(" WHERE ").append(queryString).toString();
	}
	
	//返回查询条件中的占位符参数值
	public List<Object> getParameters(){
		return parameters;
	}
public List<Product> query(ProductQueryObject qo) {
		String sql="SELECT * FROM product"+qo.getQuery();  
		System.out.println(sql);
		return JdbcTemplate.query(sql, new BeanListHandler<>(Product.class), qo.getParameters().toArray());
	}

 

高级查询的前台设计

 

在list.jsp中增加表单

<form action="product" method="post">
		商品名称<input type="text" name="name" value="${qo.name }"><br>
		商品价格<input type="text" name="minSalePrice" value="${qo.minSalePrice }">到<input type="text" name="maxSalePrice" value="${qo.maxSalePrice }">
		<input type="submit" value="提交查询" style="background-color:blue">
</form>
public class ProductServlet2 extends HttpServlet{
	
	private static final long serialVersionUID = 1L;
	private ProductDAO2 dao;
	private ProductDirDAO2 dirDAO;
	public void init() {
		dao=new ProductDAOImpl2();
	}
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		ProductQueryObject qo=new ProductQueryObject(); 
		this.reqToObject(qo,req);
		req.setAttribute("qo", qo);
		List<Product> products=dao.query(qo);
		req.setAttribute("products", products);//
	    req.getRequestDispatcher("/WEB-INF/list.jsp").forward(req, resp);
	}
	
	
	private void reqToObject(ProductQueryObject qo, HttpServletRequest req) {
		String name=req.getParameter("name");
		String minSalePrice=req.getParameter("minSalePrice");
		String maxSalePrice=req.getParameter("maxSalePrice");
		if(StringUtils.isNotBlank(name)) {
			qo.setName(name);
		}
		if(StringUtils.isNotBlank(minSalePrice)) {
			qo.setMinSalePrice(new BigDecimal(minSalePrice));
		}
		if(StringUtils.isNotBlank(maxSalePrice)) {
			qo.setMaxSalePrice(new BigDecimal(maxSalePrice));
		}
	}
	
}

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值