java递归查询分类及分类下所有子分类
该案例是实际开发中运用,java递归查询分类及分类下所有子分类。
代码走起:
1.jsp页面布局样式这里不再介绍,js业务逻辑展示分类树形结构如下:
/*** 商品分类操作*//*** 初始化*/
$(function(){//加载树reloadTree();});});/*** 加载树*/
function reloadTree(){//加载列表树initGoodsCateTree(1);//加载添加分类弹框树initGoodsCateTree(2);//加载编辑分类弹框树initGoodsCateTree(3);
}/*** 初始化商品分类树* type:1列表树2弹框树*/
function initGoodsCateTree(type){$.ajax({type:"post", url: "queryAllCate.htm",async:false, //同步cache:false, //清除缓存dataType:"json",success: function(data){if(type==1){//加载列表树$("#cat_tree").html("");}else if(type==2){//加载添加分类弹框树$("#parentCate_add .tree").html("");}else if(type==3){//加载编辑分类弹框树$("#parentCate_edit .tree").html("");}loadGoodsCateTree(data,0,type);//加载分类树样式initGoodsCateTreeCss();}});
}/*** 递归树* datas:商品分类数据* parendId:父节点默认为0* type:1列表树2弹框树*/
function loadGoodsCateTree (datas,parentId,type){if(datas!=null){if(parentId==0){for(var i=0;i<datas.length;i++){var data=datas[i];if(type==1){//拼接列表树$("#cat_tree").append(goodsCateHtml(data));}else if(type==2){//拼接添加分类弹框树$("#parentCate_add .tree").append(selectGoodsCateHtml(data,"cateAdd"));}else if(type==3){//拼接编辑分类弹框树$("#parentCate_edit .tree").append(selectGoodsCateHtml(data,"cateEdit"));}//递归所有子节点for(var j=0;j<data.cateVos.length;j++){var dataCate=data.cateVos[j];loadGoodsCateTree(dataCate,dataCate.catId,type);}}}else{//非父节点var data=datas;if(type==1){//拼接列表树$("#cat_tree").append(goodsCateHtml(data));}else if(type==2){//拼接添加分类弹框树$("#parentCate_add .tree").append(selectGoodsCateHtml(data,"cateAdd"));}else if(type==3){//拼接编辑分类弹框树$("#parentCate_edit .tree").append(selectGoodsCateHtml(data,"cateEdit"));}//递归所有子节点for(var j=0;j<data.cateVos.length;j++){var dataCate=data.cateVos[j];loadGoodsCateTree(dataCate,dataCate.catId,type);}}}
}/*** 拼接商品分类列表树* data:商品分类数据*/
var goodsCateHtml=function (data) {var html="";//默认只展示父节点if(data.catGrade==1){html= '<div depath="'+data.catGrade+'" class="clear_cat row" cid="'+data.catId+'" pid="'+data.catParentId+'" >'}else{html= '<div depath="'+data.catGrade+'" class="clear_cat row" style="display:none;" cid="'+data.catId+'" pid="'+data.catParentId+'" >'}html= html+'<table>'+'<tbody>'+'<tr>'+'<td class="td1">'+'<div >'+'<span class="handle-icon">'+'<img src="data:images/cticon2.png" alt="收起子分类" title="收起子分类" class="handle-hide" app="desktop" style="display: none;">'+'<img src="data:images/cticon1.png" alt="展开子分类" title="展开子分类" class="handle-show" app="desktop">'+'</span>'+'<a >'+data.catName+'</a>'+'</div>'+'</td>'+'<td class="td2"><span class="quiet">['+data.typeName+']</span></td>'+'<td class="td3"><b>'+data.catSort+'</b></td>'+'<td class="td4">'+'<a href="javascript:void(0);" class="addSubNote" οnclick="addSubCate('+data.catId+','+data.catGrade+',\''+data.catName+'\')">增加子类</a>'+ '<a href="javascript:void(0);" οnclick="editGoodsCate('+data.catId+')">编辑</a>'+ '<a href="javascript:void(0);" οnclick="deleteGoodsCate('+data.catId+')">删除</a>'+'</td>'+'<td class="td5">'+'<input type="hidden" value="'+data.catIsFinal+'"/>'+'</td>'+'</tr>'+'</tbody>'+'</table>'+'</div>';return html;
}/*** 加载商品分类树样式*/
function initGoodsCateTreeCss(){$(".clear_cat").each(function(){//判断是否是末级var isM = $(this).find(".td5 input").val();if(isM == 1){//末级节点不展示图标$(this).find(".handle-icon").remove();//不显示添加子类$(this).find(".addSubNote").remove();}else {//非末级节点不显示类型名称$(this).find(".quiet").html(" ");}//子节点添加样式var depath = $(this).attr("depath");$(this).find(" .td1>div").css("padding-left",20*depath+"px");});
}/*** 拼接商品分类弹框树* data:商品分类数据*/
var selectGoodsCateHtml=function (data,divId){var html="";//默认只展示父节点if(data.catGrade==1){html= '<div depath="'+data.catGrade+'" class="clear_cat row" cid="'+data.catId+'" pid="'+data.catParentId+'" >'}else{html= '<div depath="'+data.catGrade+'" class="clear_cat row" style="display:none;" cid="'+data.catId+'" pid="'+data.catParentId+'" >'}html= html+'<table>'+'<tbody>'+'<tr>'+'<td class="td1">'+'<div >'+'<span class="handle-icon">'+'<img src="data:images/cticon2.png" alt="收起子分类" title="收起子分类" class="handle-hide" app="desktop" style="display: none;">'+'<img src="data:images/cticon1.png" alt="展开子分类" title="展开子分类" class="handle-show" app="desktop">'+'</span>'+'<a href="javascript:void(0);" οnclick="selectParentCate('+data.catId+','+data.catGrade+',\''+data.catName+'\',\''+divId+'\')" >'+data.catName+'</a>'+'</div>'+'</td>'+'<td class="td5">'+'<input type="hidden" value="'+data.catIsFinal+'"/>'+'</td>'+'</tr>'+'</tbody>'+'</table>'+'</div>';return html;
}/*** 点击上级分类显示弹框树*/
function showParentCate(){if($(".cateTree").css("display")=="none"){$(".cateTree").show();}else{$(".cateTree").hide();}
}/***点击上级分类显示弹框树,选择任意一个上级分类名称赋值至文件框* parentId:父节点id* parentGrade:父节点层级* parentName:父节点名称
* divId:div标识判断是添加分类弹窗还是编辑分类弹窗*/
function selectParentCate(parentId,parentGrade,parentName,divId){//alert("parentId:"+parentId);alert("parentGrade:"+parentGrade);alert("parentName:"+parentName);alert("divId:"+divId);if(divId=="cateAdd"){$("#catParentName_add").val(parentName);$("#catParentId_add").val(parentId);$("#catGrade_add").val(parentGrade);}else if(divId=="cateEdit"){$("#catParentName_edit").val(parentName);$("#catParentId_edit").val(parentId);$("#catGrade_edit").val(parentGrade);}//隐藏弹框树$(".cateTree").hide();
}
备注:
1.注意用了代码重构的思想,如添加分类,编辑分类都要显示谈框树,则用type来区分是添加显示还是编辑显示
2.js执行顺序是从上到下,代码顺序很重要,在实际开发中因为代码放的位置不对,导致展示数据异常,这里就明显体现了。
3.从后台递归查询了数据,前台没有用任何框架,纯js+css展示,这里用js递归方法展示,本人是第一次写,觉得非常好,留着纪念
后台代码:
controlle层:
/*** 递归查询商品分类* @return*/@RequestMapping("/queryAllCate")@ResponseBodypublic List<GoodsCateVo> queryGoodsCateVo(HttpServletRequest request) {//获取参数(all查询所有)String queryType = request.getParameter("queryType");Date date=new Date();List<GoodsCateVo> list=new ArrayList<GoodsCateVo>();HashMap<String, Object> paramMap=new HashMap<String, Object>();try {//根据父节点递归查询子节点if(!"all".equals(queryType)){paramMap.put("catParentId", 0);}list=goodsCateService.findAllGoodsCate(paramMap);System.out.println("查询耗时:"+(new Date().getTime()-date.getTime()));} catch (Exception e) {e.printStackTrace();LOGGER.error("递归查询商品分类失败"+e.getMessage(),e);}return list;}
注意这里查询是所有父分类即catParentId=0,然后根据父分类递归查询所有子分类
serverImpl业务层:
/*** @descript:根据父节点递归查询子节点* @param:* @return:*/@Transactional(readOnly=true)public List<GoodsCateVo> findAllGoodsCate(Map<String, Object> paramMap){//封装返回结果List<GoodsCateVo> list=new ArrayList<GoodsCateVo>();try {//查询所有父商品分类List<GoodsCateVo> goodsParentCateList=goodsCateMapper.queryAllParentGoosCate(paramMap);if(goodsParentCateList!=null && !goodsParentCateList.isEmpty()){for(GoodsCateVo cateVo:goodsParentCateList){// 初始化变量申明GoodsCateVo vo=new GoodsCateVo();vo.setCatId(cateVo.getCatId());vo.setCatName(cateVo.getCatName());vo.setCatParentId(cateVo.getCatParentId());vo.setCatGrade(cateVo.getCatGrade());vo.setCatSort(cateVo.getCatSort());vo.setCatRate(cateVo.getCatRate());vo.setCatIsFinal(cateVo.getCatIsFinal());vo.setTypeId(cateVo.getTypeId());vo.setTypeName(cateVo.getTypeName());//子分类参数Map<String, Object> dataMap=new HashMap<String, Object>();dataMap.put("catParentId", cateVo.getCatId());//通过父分类递归子分类,最后一级不递归,商品分类是否是末级0否1是if("0".equals(cateVo.getCatIsFinal())){vo.setCateVos(findAllGoodsCate(dataMap));}list.add(vo);}}} catch (Exception e) {e.printStackTrace();LOGGER.error("查询商品分类失败"+e.getMessage(),e);}return list;}
mybatis查询:
<!-- 根据父节点递归查询子节点 --><select id="queryAllParentGoosCate" parameterType="java.util.Map" resultMap="goodsCateVo">select <include refid="goodsCateVo_Colimn_list" />from t_goods_category c left join t_goods_type t on c.type_id=t.type_id and t.type_delflag='0'where c.cat_delflag='0' <if test="catParentId != null" >and c.cat_parent_id=#{catParentId}</if>order by c.cat_sort,c.cat_id</select>
实体类:
package com.qianjiang.goods.vo;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** 商品分类VO*/
public class GoodsCateVo implements Serializable{/*** 序列化*/private static final long serialVersionUID = -1362577335137261590L;/**分类ID*/private Long catId;/**分类名称*/private String catName;/**父级分类ID*/private Long catParentId;/**商品类型ID*/private Long typeId;/**类型排序*/private Integer catSort;/**层级*/private Integer catGrade;/**类型名称*/private String typeName;/**子级的CateVo集合,默认为空(这样定义是因为在js递归子分类出现异常故这样定义给个默认值)*/private List<GoodsCateVo> cateVos=new ArrayList<GoodsCateVo>(0);/**类目扣率*/private BigDecimal catRate;/**商品分类是否是末级0否1是*/private String catIsFinal;public BigDecimal getCatRate() {return catRate;}public void setCatRate(BigDecimal catRate) {this.catRate = catRate;}public Long getCatId() {return catId;}public void setCatId(Long catId) {this.catId = catId;}public String getCatName() {return catName;}public void setCatName(String catName) {this.catName = catName;}public Long getCatParentId() {return catParentId;}public void setCatParentId(Long catParentId) {this.catParentId = catParentId;}public Long getTypeId() {return typeId;}public void setTypeId(Long typeId) {this.typeId = typeId;}public Integer getCatSort() {return catSort;}public void setCatSort(Integer catSort) {this.catSort = catSort;}public Integer getCatGrade() {return catGrade;}public void setCatGrade(Integer catGrade) {this.catGrade = catGrade;}public String getTypeName() {return typeName;}public void setTypeName(String typeName) {this.typeName = typeName;}public List<GoodsCateVo> getCateVos() {return cateVos;}public void setCateVos(List<GoodsCateVo> cateVos) {this.cateVos = cateVos;}public String getCatIsFinal() {return catIsFinal;}public void setCatIsFinal(String catIsFinal) {this.catIsFinal = catIsFinal;}}
补充:
这里用到一个方法:Select下拉框onchange事件获取option的value值
jsp:
<div class="form-group"><label class="col-sm-5 control-label"> <span class="text-danger">*</span>是否末级:</label><div class="col-sm-14"> <select class="form-control w100 required" data-live-search="false" name="catIsFinal" οnchange="changeSelect(this.options[this.options.selectedIndex].value,'cateRate_add');"><option value="">请选择</option><option value="0">否</option><option value="1" >是</option></select></div><div class="col-sm-4"></div>
</div>
js方法:
/*** select change事件* 判断是否末级,若是显示分类扣率否则不显示* catIsFinal 0否1是* @param obj select选中的值* @param divId 分类扣率divId*/
function changeSelect(obj,divId){//alert("select value:"+obj); alert("divId:"+divId);var catIsFinal=obj;if(catIsFinal=="1"){//添加验证$("#"+divId).find("select").addClass("required");$("#"+divId).find("input").addClass("required");//显示分类扣率$("#"+divId).show();}else{//移除验证$("#"+divId).find("select").removeClass("required");$("#"+divId).find("input").removeClass("required");//隐藏分类扣率$("#"+divId).hide();}
}
案例中放开alert,obj就是下拉框选中的值
java递归查询分类及分类下所有子分类相关推荐
- oracle 查询无限开始,Oracle无限分级下查询指定分类下所有子分类Sql
表结构: create table "KDCategory" ( "CategoryID" INTEGER not null, "CategoryNa ...
- Magento获取指定分类下的所有子分类信息
二次开发中经常遇到一种情况,就是判断一个分类是否属于某一个大的分类,而大的分类包括很多子分类成树状结构,基本的方法都是先获取大分类下的所有子分类的信息,然后再挨个比较看是否有ID和待定ID相等.一种用 ...
- php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数
emlog程序获取主分类下的所有子分类ID函数 蓝叶 网站设计 2021-01-04 208 0评论 emlog程序在制作模版时,需要增加一些自定义的列表调用,只设置主分类ID ...
- r读取文件夹下的所有csv文件_[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。...
解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...
- Android 开源项目分类汇总(下)
Android 开源项目分类汇总(下) 九.ScrollView Discrollview 支持滚动时 Item 淡入淡出,平移,缩放效果的 ScrollView 项目地址:https://githu ...
- java递归查询公司下所有部门及子部门
业务要求: 查询公司下所有子部门及子部门: 原型: 1.创建公司和部门实体: CompanyVos: package com.suwei.sysMng.vo; import java.io.Ser ...
- Vue前台两级下拉栏分类内容
简介 本篇主要记录一下vue中从后台获取数据后,在前台利用下拉栏对数据进行分类筛选显示 开发工具,环境 nacos,idea,springboot,vscode,vue 流程 首先背景是后台提供课程的 ...
- Python使用matplotlib可视化多分类变量组合下分组小提琴图、使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots)
Python使用matplotlib可视化多分类变量组合下分组小提琴图.使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots) 目录
- 谷歌推出新模型「pQRNN」,少量参数下进行文本分类,性能堪比BERT
近日,谷歌推出了新模型「pQRNN」,它是由去年推出的「PRADO」进一步使用小模型改进而得,达到了SOTA结果.pQRNN的新颖之处在于,它可以结合一个简单的映射和一个quasi-RNN编码器来进行 ...
最新文章
- Java内存回收机制基础[转]
- 显著性检验python
- 4.Ling初体验 匿名类型在查询表达式中的使用
- E0144	const char * 类型的值不能用于初始化 char * 类型的实体
- Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据
- 类的继承与sizeof
- 关于40位MD5加密的破解
- 关于我喜欢计算机的作文600字,关于我喜欢的字作文600字5篇
- Spring事务管理介绍
- 使用数据库表查询的方式直接获得CRM服务订单的sold to party信息
- Monkey测试实例
- 【杭州】Hack for Cloud Beginner微软黑客松大赛
- atitit.userService 用户系统设计 v6 q413
- python调用sklearn库BP神经网络基于小样本进行痘痘预测尝试
- jquery学习文档
- pandas用法-全网最详细教程
- 微信打开h5链接,缓存未清除解决办法
- 33个CadQuery程序化建模实例
- R语言构建logistic回归模型并使用偏差(Deviance)和伪R方(pseudo R-squared )评估概率模型:使用sigr包快速计算偏差和伪R方、AIC赤信息指标和偏差的关系
- Tenacity——Exception Retry 从此无比简单
热门文章
- 构建线上线下一体化解决方案,旺小宝以AI赋能房企数智化营销|爱分析访谈
- 水果店圈子:怎么做好水果店线上营销方案,水果店线上如何做
- 对策论基础---其他类型对策简介
- 【Reinforcement Learning】蒙特卡洛算法
- Glide图片旋转与放大缩小
- mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除
- 用Android手机远程桌面连接登陆Windows10(用微软账号登陆),Microsoft账户登陆的计算机远程桌面连接问题
- pythonrender函数_Render函数
- Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
- unity通过鼠标滑轮控制物体大小