mybatis基于注解的多对多关联操作
文章目录
一、前言
一名角色对应多种权限,一种权限也会被多个角色同时拥有,所以角色表和权限表是多对多关系,这时需要引入中间表(角色-权限表)来映射,角色表与中间表和权限表与中间表都是一对多关系。
二、实体类:
1、角色类RoleInfo
省略get和set方法
package com.ssm.pojo;
import java.util.List;
public class RoleInfo { //角色信息
private int roleId; //角色编号
private String roleType; //角色类型
private String rolePermission; //角色权限
private String roleRemark; //备注
private List<UserInfo> userInfos;
//模块
private List<ModuleInfo> moduleInfoList;
}
2、权限类:ModuleInfo
/**
* 模板
*/
package com.ssm.pojo;
import java.util.ArrayList;
import java.util.List;
public class ModuleInfo {
/**模板编码*/
private String moduleCode;
/**模板名称*/
private String moduleName;
/**模板路径*/
private String modulePath;
/**父级模板编号*/
private String parentCode;
/**是否为叶子节点*/
private int isLeaf;
/**同级排序编号*/
private int sortNumber;
//角色
List<RoleInfo> roleInfoList;
}
3、中间表ModuleRole
//角色和权限的关联表
public class ModuleRole {
private int id; //序号
private int roleId; //角色编号
private String moduleCode;//模块编号
}
三、多对多操作
1、向中间表插入数据
//向关联表插入数据
@Insert("<script>" +
"insert into moduleRole(roleId,moduleCode)" +
"select r.roleId,m.moduleCode from roleInfo r,moduleInfo m" +
"<where>" +
"r.roleId=#{roleInfo.roleId} and m.moduleCode in" +
"<foreach collection='moduleCodeList' item='moduleCode' index='index' open='(' separator=',' close=')'>" +
"#{moduleCode}" +
"</foreach>" +
"</where>" +
"</script>"
)
Integer addModuleRole(@Param("roleInfo") RoleInfo roleInfo,@Param("moduleCodeList") String[] moduleCodeList);
2、删除关联表数据
//根据角色编号删除关联表数据
@Delete("delete from moduleRole where roleId=#{roleId}")
Integer deleteModuleRole(RoleInfo roleInfo);
3、获取角色列表并查明每个角色的权限
//获取满足条件的角色列表
@Results({
@Result(id = true,column = "roleId",property = "roleId"),
@Result(column = "roleType",property = "roleType"),
@Result(column = "rolePermission",property = "rolePermission"),
@Result(column = "roleRemark",property = "roleRemark"),
@Result(column = "roleId",property = "moduleInfoList",
many = @Many(select ="com.ssm.dao.ModuleInfoDao.findModuleByRoleId"))
})
@Select("select * from roleInfo")
List<RoleInfo> list();
//根据角色编号查询角色可操作菜单
@Select("select * from moduleInfo f where moduleCode in(select moduleCode from moduleRole where roleId=#{roleId})")
List<ModuleInfo> findModuleByRoleId(Integer roleId);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-03-25 单链表(带头结点)