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);

四、数据库表结构

1、角色表roleInfo

在这里插入图片描述

2、权限表moduleInfo

在这里插入图片描述

3、中间表moduleRole

在这里插入图片描述

posted @   别团等shy哥发育  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· 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 单链表(带头结点)
点击右上角即可分享
微信分享提示