使用Mybatis 注解的方式进行 无限极分类
我们在开发的时候总归会需要无限极分类的。比如说做权限控制的时候。 一个用户管理下有添加用户,编辑用户,删除用户。这些权限下面有的可能还存在子权限。那么这个时候就需要用刀无限极分类了。下面开始试试吧。
数据库表结构
DROP TABLE IF EXISTS `stack_permission`;
CREATE TABLE `stack_permission` (
`id` bigint(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`type` int(2) NOT NULL,
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`order` bigint(20) NOT NULL,
`p_id` bigint(11) NOT NULL,
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `in_per_name`(`name`) USING BTREE,
INDEX `in_per_type`(`type`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of stack_permission
-- ----------------------------
INSERT INTO `stack_permission` VALUES (1, '删除用户', 'd', 1, 'admin/d', 1, 5, '无');
INSERT INTO `stack_permission` VALUES (2, '添加用户', 'c', 1, 'admin/c', 1, 5, '无');
INSERT INTO `stack_permission` VALUES (3, '读取用户', 'r', 1, 'admin/r', 1, 5, '无');
INSERT INTO `stack_permission` VALUES (5, '用户管理', 'm', 1, '', 1, 0, '无');
SET FOREIGN_KEY_CHECKS = 1;
我们这边添加的数据为。
[
{
"code":"m",
"description":"无",
"name":"用户管理",
"order":1,
"pId":0,
"permissions":[
{
"code":"d",
"description":"无",
"name":"删除用户",
"order":1,
"pId":5,
"permissions":[],
"type":1,
"url":"admin/d"
},
...
]
}
]
这边默认你有mybatis-plus使用经验
实体类
package cn.fllday.memory.entity;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author gssznb
* @since 2019-07-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class StackPermission implements Serializable {
private static final long serialVersionUID=1L;
private Long id;
private String name;
private String code;
private Integer type;
private String url;
private Long order;
private Long pId;
private String description;
// 用来保存子集权限
private List<StackPermission> permissions;
}
Dao层写法
@Select("SELECT * FROM stack_permission WHERE p_id = #{id}")
@Results({
@Result(property = "permissions",column = "id",id=true,many = @Many(select = "cn.fllday.memory.mapper.StackPermissionMapper.selectPermissionByPId"))
})
List<StackPermission> selectPermissionByPId(Long id);
使用Junit 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class Memory_8080AppTest {
@Autowired
private IStackAdminService iStackAdminService;
@Autowired
private IStackPermissionService iStackPermissionService;
@Test
public void contextLoads(){
List<StackPermission> permissionById = iStackPermissionService.findPermissionById(0L);
String s = JSON.toJSONString(permissionById);
System.out.println(s);
}
}
[
{
"code": "m",
"description": "无",
"name": "用户管理",
"order": 1,
"pId": 0,
"permissions": [
{
"code": "d",
"description": "无",
"name": "删除用户",
"order": 1,
"pId": 5,
"permissions": [
],
"type": 1,
"url": "admin/d"
},
{
"code": "c",
"description": "无",
"name": "添加用户",
"order": 1,
"pId": 5,
"permissions": [
],
"type": 1,
"url": "admin/c"
},
{
"code": "r",
"description": "无",
"name": "读取用户",
"order": 1,
"pId": 5,
"permissions": [
],
"type": 1,
"url": "admin/r"
}
],
"type": 1,
"url": ""
}
]