@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;
}
四种方式查出来的结果是一样的,但效率方面法四最快