抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

@auther by sizaif

@TOC

结构

Bean

code
@JsonIdentityInfo( generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class PermissionVO implements Serializable{
	private static final long serialVersionUID = -2783081162690878303L;
	private Integer id;

	private String name;

    private Integer pid;

	private Integer istype;

	private String code;

	private String page;

	private boolean checked;

	private boolean open;

    private List<PermissionVO> children;

法一:使用mybatis映射实现

mabatis.xml配置

code
<!--=Start findPerms 查找权限树列表 结果集映射-->
    <resultMap id="findPermissionMap" type="com.sizaif.emsdemo.dto.PermissionVO">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="pid" column="pid"/>
        <result property="istype" column="istype"/>
        <result property="code" column="code"/>
        <result property="page" column="page"/>
        <collection property="children"  column="id" ofType="com.sizaif.emsdemo.dto.PermissionVO" select="findChildPerm"/>
    </resultMap>
    <!--=End findPerms 查找权限树列表-->
    <!-- pID 对应 PermissionVO 中 pID-->
    <sql id="PermColumn" >
        id, name,pid,istype, code,page
    </sql>

    <!--=Start findPerms 查找权限树列表-->
    <select id="findPerms"  resultMap="findPermissionMap">
        SELECT
          <include refid="PermColumn" />
        FROM
          permission
        WHERE
          pid = 0 OR  pid is NULL
    </select>
    <!--=End findPerms 查找权限树列表-->

    <!--=Start findChildPerm 查找所有子节点权限-->
    <select id="findChildPerm" resultMap="findPermissionMap">
        select
        <include refid="PermColumn" />
        from permission
        where pid = #{pid}
    </select>
    <!--=End findChildPerm 查找所有子节点权限-->

service层调用

@Override
public List<PermissionVO> findPerms() {
    return permissionsMapper.findPerms();
}

controller

List<PermissionVO> pvos = authService.findPerms();

法二:通过递归实现

mybatis.xml配置

code
<resultMap id="BaseResultMap" type="com.sizaif.emsdemo.dto.PermissionVO">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="pid" column="pid"/>
    <result property="istype" column="istype"/>
    <result property="code" column="code"/>
    <result property="page" column="page"/>
</resultMap>
<select id="getChildren" resultMap="BaseResultMap">
    select id, pid, name, istype, code,page
    from permission where pid = #{id}
</select>

service

@Override
public List<PermissionVO> getChildPerms(Integer id) {
    return permissionsMapper.getChildren(id);
}

controller

code
public PermissionVO initPermission1(){
    PermissionVO permissionvo=new PermissionVO ();
    try{
        permissionvo.setId(0);//这个地方应该通过数据库查询出根节点,因为根节点id在数据库是0,
        queryChildPermissions(permissionvo);//递归得到全部节点
    }catch (Exception e){
        throw  e;
    }
    return permissionvo;
}
private void queryChildPermissions (PermissionVO permissionvo){
    List<PermissionVO> children=  authService.getChildPerms(permissionvo.getId());//通过id查询子集合
    permissionvo.setChildren(children);//将查询出来的子节点集合放入到permissionvo集合中
    for(PermissionVO innerChildren:children){        //遍历出子集合的子集合
        queryChildPermissions(innerChildren);      //放入到子节点的子集合中
    }
}

法三: 一次查出全部记录,通过嵌套循环遍历结果

xml

code
<resultMap id="BaseResultMap" type="com.sizaif.emsdemo.dto.PermissionVO">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="pid" column="pid"/>
    <result property="istype" column="istype"/>
    <result property="code" column="code"/>
    <result property="page" column="page"/>
</resultMap>
<select id="selectAll" resultMap="BaseResultMap">
    select id, pid, name, istype,code,page
    from permission
</select>

service:

@Override
public List<PermissionVO> selectAll() {
    return permissionsMapper.selectAll();
}

controller:

code
public PermissionVO initPermissionVO(){

    PermissionVO permissionvo = new PermissionVO ();
    List<PermissionVO> lists= authService.selectAll();//查询所有节点
    try{
        for(PermissionVO ps:lists){//遍历节点
            PermissionVO child = ps;
            if( ps.getPid().equals(0) || ps.getPid() == null){//获取根节点,Integer类型是包装类,判断对象引用
                permissionvo = ps;//根节点
            }else{
                for (PermissionVO innerpermissionvo:lists){
                    if(child.getPid() == innerpermissionvo.getId()){//如果节点的的pid和集合中某个节点的id一致
                        PermissionVO parent=innerpermissionvo;//将这个节点命名为父节点
                        parent.getChildren().add(child);//然后把child放入到它的父亲集合中
                        break;
                    }
                }
            }
        }
    }catch (Exception e){
        throw  e;
    }
    return permissionvo;
}

法四:一次查出所有数据,通过Map集合实现树结构

xml 与service 与法三一致,

controller:

code
public PermissionVO initPermission(){
    PermissionVO permissionvo=new PermissionVO ();
    List<PermissionVO> lists = authService.selectAll();//查询所有节点
    Map<Integer,PermissionVO> map = new HashMap<Integer,PermissionVO>();//将所有节点存入到map集合
    try{
        for(PermissionVO ps:lists) {
            map.put(ps.getId(),ps);//将所有id做为key,Permissionvo对象做值,存入到map集合
        }
        for(PermissionVO ps:lists){//遍历所有节点
            PermissionVO child = ps;
            if (child.getPid().equals(0)||child.getPid()==null){
                permissionvo = ps;//取出根节点
            }else{
                PermissionVO parent = map.get(child.getPid());//通过子节点的pid获取父节点
                parent.getChildren().add(child);//将子节点放入父节点中
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return permissionvo;
}

四种方式查出来的结果是一样的,但效率方面法四最快

评论吧



本站总访问量为 访客数为

鲁 ICP 备 20018157 号-1
Copyright 2021 - 2022 sizaif. All Rights Reserved