前导:我们在开发过程中常用到递归查询,如菜单,一般我们都是用ztree实现菜单,但是数据查询时需要用到递归语句
1、建表:
create table menu{
menu_Id varchar(31),
menu_name varchar(31),
menu_level char(1),
parent_Id varchar(31)
}
2、建JavaBean
package org.gtiles.components.courseinfo.unit.dao;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName Menu
* @Description: TODO(这里用一句话描述这个类的作用)
* @author huguangjun
* @date 2016年6月28日 下午7:52:41
*/
public class Menu {
public String menuId;
public String menuName;
public String menuLevel;
public String parentId;
public List<Menu> childList = new ArrayList<Menu>();
public String getMenuId() {
return menuId;
}
public void setMenuId(String menuId) {
this.menuId = menuId;
}
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public String getMenuLevel() {
return menuLevel;
}
public void setMenuLevel(String menuLevel) {
this.menuLevel = menuLevel;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<Menu> getChildList() {
return childList;
}
public void setChildList(List<Menu> childList) {
this.childList = childList;
}
}
3、orcle中递归查询语句
select t.id AS menuid,t.menu_name AS menuName,t.Parent_Id AS paterId from aut_menu_t t
where 1=1 START WITH t.menu_id='root' connect by t.Parent_Id= PRIOR t.menu_id
4、 mybatis+mysql实现递归查询
<!--查询所有,使用resultMap返回结果集,将数据组装成树形结构 -->
<select id="findMenuAll" resultMap="menu_map">
select * from menu where menu_level='1'
</select>
<!-- 返回结果集 -->
<resultMap type="....entity.menu" id="menu_map">
<id column="menu_id" property="menuId"/>
<result column="menu_name" property="menu_name"/>
<result column="menu_level" property="menuLevel"/>
<collection property="childList" column="menu_id " ofType="....entity.menu"
select="findMenuByparentId"></collection>
</resultMap>
<!-- 根据父键查询 -->
<select id="findMenuByparentId" parameterType="String" resultMap="menu_map">
select * from menu where parent_id=#{menuId}
</select>
将数据在mybatis xml文件中将数据就封装好,免得在java程序中再次封装数据
5、页面上读取数据则此处使用freemarker为列子
<#list menulist as menu>
${menu.menuName}
<#list menu.childList asmenuChild>
${menuChild.menuName}
<#list>
<#list>
以上是从数据库层面处理,但是如是高并发这样效率的会很低。还可以使用java实现在内存中处理