Advertisement

java大量条件查询_Java多条件复杂查询

阅读量:

查询是我们日常生活中最常见的功能,有的查询很复杂,有的查询很简单,而我要说的查询说它复杂也不复杂,说它简单也不是很简单。下面我先给出我的UI界面和业务需求。
7c4cb5b4b071bbdcdc86993f3813c465.png

需求是需要根据树形的某个节点查询对应类型商品信息(注意:如果这个节点下存在子节点,那么需要把这个节点下所有子节点对应的商品类型的商品信息查询出来),或者在它的基础上在筛选出不同状态的商品信息,还可以在两者的基础上通过某一个查询项目的具体信息使用模糊查询匹配出对应商品信息。

通过上面的需求和UI界面可以分析我们需要的参数有:树形节点、商品状态、查询项目类型、查询项目内容。总共四个参数,只有第一个树形节点参数需要特别处理一下,其他都是直接获取即可。

jsp代码:定义一个全局参数用来接收节点数据,使用findAllNodes(x)方法递归获取所有子节点。还有就是查询项目类型中有两个类型在数据库中我设计的是布尔类型,所以在这里用三目表达式处理了一下。

//条件查询渲染数据方法

function tbCommoditySearch() {

var nodeObj = (($.fn.zTree.getZTreeObj("sxt")).getSelectedNodes())[0];

if (nodeObj != "" && nodeObj != null && nodeObj != undefined) {

nodeId = "";

nodeId += nodeObj.id;

nodeId = findAllNodes(nodeObj);

} else {

var nodeTop = (($.fn.zTree.getZTreeObj("sxt")).getNodes())[0];

nodeId = "";

nodeId += nodeTop.id;

nodeId = findAllNodes(nodeTop);

}

var contentType = $("#contentType").val();

var content = $("#content").val();

$("#contentType").val();

if (contentType == 6) {

content = content != "是" ? "1" : "0";

} else if (contentType == 5) {

content = content != "是" ? "0" : "1";

}

TbCommodity = layuiTable.reload("tbCommodity", {

url : "${syspath}/servlet/CommodityServlet",

where : {

type : "tbCommoditySearch",

nodeId : nodeId,

check : $("input[type='checkbox']").prop("checked"),

contentType : contentType,

content : content

}

});

}

//递归获取所有子节点的ID

function findAllNodes(nodeObj) {

var nodeArr = nodeObj.children; //没有子节点==undefined

if (nodeArr != undefined) {

for ( var i = 0; i < nodeArr.length; i++) {

nodeId += "," + nodeArr[i].id;

if (nodeArr[i].children != undefined) {

findAllNodes(nodeArr[i]);

}

}

}

return nodeId;

}

Servlet代码:直接获取传递过来的参数调用接口方法最后通过流的方式传回jsp页面就行了。

public void tbCommoditySearch(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String content = request.getParameter("content");

String nodeId = request.getParameter("nodeId");

boolean bool = Boolean.valueOf(request.getParameter("check"));

int contentType = Integer.valueOf(request.getParameter("contentType"));

List commodityList = iCommodityService.findAllByC(

nodeId, contentType, content, bool);

LayuiTableData lyData = new LayuiTableData(

commodityList.size(), commodityList);

PrintWriter out = response.getWriter();

out.write(ToJsonUtil.toJson(lyData));out.flush();out.close();

}

最后是接口查询方法的代码:

因为是通过执行sql语句来进行查询的,所以要特别注意sql语句的处理。这里因为每次查询的参数个数不确定所以先定义个字符串类型的全局变量用来装sql语句,并且先不给sql语句加WHERE语句。

String findAllByC = "SELECT b_commoditydetail.CommodityDetailID,CommodityCode,CommodityName,"

+ "CommodityStyleNumber,ColorName,SizeName,Amount,TagPrice,Putaway FROM b_commodity"

+ " JOIN b_commoditydetail ON b_commoditydetail.CommodityID = b_commodity.CommodityID"

+ " JOIN d_color ON d_color.ColorID = b_commoditydetail.ColorID"

+ " JOIN d_size ON d_size.SizeID = b_commoditydetail.SizeID"

+ " JOIN d_inventory ON d_inventory.CommodityDetailID = b_commoditydetail.CommodityDetailID";

然后就在方法内根据参数的不同给sql语句拼接不同的条件语句,注意拼接时每个语句之间需要拼接空格。

简单说一下我的思路:我将这个方法分为两个主要点,第一个主要点就是根据不同情况拼接不同的条件。第二个主要点就是根据条件拼接时的情况给条件参数赋参数值。

public List findAllByC(String nodeId, int id,

String content, boolean bool) {

String[] contentType = new String[] { "CommodityCode", "CommodityName",

"CommodityStyleNumber", "ColorName", "SizeName","SpecialOffer", "Putaway" };

List list = null;

StringBuffer bufferSql = new StringBuffer(findAllByC);

bufferSql.append(" WHERE b_commodity.CommodityTypeID IN(" + nodeId + ")");

if (bool) {

bufferSql.append(" AND Putaway=?");

if (contentType[id] != "SpecialOffer"

&& contentType[id] != "Putaway") {

bufferSql.append(" AND " + contentType[id] + " LIKE ?");

} else if (contentType[id] != "Putaway") {

bufferSql.append(" AND SpecialOffer = ?");

}

} else {

if (contentType[id] != "SpecialOffer"

&& contentType[id] != "Putaway") {

bufferSql.append(" AND " + contentType[id] + " LIKE ?");

} else if (contentType[id] != "Putaway") {

bufferSql.append(" AND SpecialOffer = ?");

} else {

bufferSql.append(" AND Putaway = ?");

}

}

try {

con = JdbcUitl.getConnection();

ps = con.prepareStatement(bufferSql.toString());

if (bool) {

ps.setBoolean(1, bool);

if (contentType[id] != "SpecialOffer"

&& contentType[id] != "Putaway") {

ps.setString(2, "%" + content + "%");

} else if (contentType[id] != "Putaway") {

ps.setInt(2, Integer.valueOf(content));

}

} else {

if (contentType[id] != "SpecialOffer"

&& contentType[id] != "Putaway") {

ps.setString(1, "%" + content + "%");

} else {

ps.setInt(1, Integer.valueOf(content));

}

}

rs = ps.executeQuery();

list = JdbcHelper.getResult(rs, CommodityDataVo.class);

} catch (SQLException e1) {

e1.printStackTrace();

} finally {

JdbcUitl.close(con, ps, rs);

}

return list;

}

总结:最重要就是sql语句,sql语句处理好了其他都不会太困难。在这里其实还可以更简单,就是在拼接条件语句的时候直接把参数值也一同拼接上去,这样就省去了给占位符赋值的代码。还有就是我这里用的那个数组装的的对应的查询项目类型字段,UI界面下拉框的值就相当于是数组的索引,之前我是直接用数组中的那些值来充当下拉框的值,后来觉得有点别扭就换成了这种写法。

全部评论 (0)

还没有任何评论哟~