java 如何在MyBatis中实现多对多关系?

pod7payv  于 2023-01-16  发布在  Java
关注(0)|答案(3)|浏览(158)

我最近正在学习使用Java框架开发Web应用程序。
该应用程序只是一个基本的注册/登录/注销系统。访客可以注册一个帐户并以common user的身份登录。除了common user之外,还有两个角色super adminadmin,它们有各自的权限。
一个Account可以同时拥有多个Role,当然,一个Role也可以应用于多个Account。这就在AccountRole之间形成了多对多(或n对n)的关系。
我在数据库中维护了三个表:

  • 第一,ACCOUNT表,该表存储账户除角色之外的信息;
  • 二是ROLE表,存储有多少个Role的信息,目前只有三个,“超级用户”、“管理员”和“普通用户”;
  • 第三个是ACCOUNT_ROLE表,它存储ACCOUNTROLE之间的Map。

我可以使用Hibernate的@ManyToMany@JoinTable注解来实现这一点,如果我这样做,第三个表可以由Hibernate自动管理.例如,当我创建Common UserAccount时,Hibernate会帮助我将包含AccountIdRoleId的条目添加到第三个表中;当我删除这个Account时,hib将帮助我删除第三个表中的相应条目。
问题是如何在MyBatis中实现这种多对多关系?
我看过一些资料介绍如何在MyBatis中建立one-to-oneone-to-many关系,但似乎MyBatis没有Hibernate那样的many-to-many关系,那怎么办呢?
我的原始想法是 * 手动管理第三个表 *,这意味着:

  • 创建新帐户时,我必须手动向第三个表中添加条目
  • 删除/更新账户时,我必须手动删除/更新相应条目

因为我对MyBatis不是很熟悉,所以这是我现在唯一能想到的办法。
我希望有人能给予我一些提示或想法或具体的例子四舍五入这个问题。

  • 加 *:我有github上的演示应用程序的代码,如果你需要看看这个演示是如何进行的。非常感谢!
to94eoyn

to94eoyn1#

用户故事

首先,MyBatis为您生成模型、Map器和mapper.xml
现在,如果您有两个模型-用户和角色
用户和角色之间的关系是什么?
一个用户有多个角色,一个角色可以授权给多个用户,所以他们是many-to-many关系。

如何实施?

  • 将列表角色添加到用户模型
private List<Role> roles = new ArrayList<>();
  • 将列表用户添加到角色模型
private List<User> users = new ArrayList<>();
  • 创建UserRoleMapper接口以添加一些方法
package com.jim.mapper;

  import com.jim.model.Role;
  import com.jim.model.User;

  import java.util.List;

  public interface UserRoleMapper {
      int deleteRole(long userId, long roleId);
      int addRole(long userId, long roleId);
      List<Role> getRoles(long userId);
      List<User> getUsers(long roleId);
  }
  • 添加一个xml到MapSQL & result。
<resultMap id="UserResultMap" type="com.jim.model.Role">
      <id column="id" jdbcType="INTEGER" property="id"/>
      <result column="name" jdbcType="VARCHAR" property="name"/>
      <collection javaType="ArrayList" property="users" resultMap="RoleResultMap" />
  </resultMap>

  <resultMap id="RoleResultMap" type="com.jim.model.User">
      <id column="id" jdbcType="BIGINT" property="id"/>
      <result column="username" jdbcType="VARCHAR" property="username"/>
      <collection javaType="ArrayList" property="roles" resultMap="UserResultMap" />
  </resultMap>

  <insert id="addRole">
      INSERT INTO user_role (userId, roleId)
      VALUES (#{userId, jdbcType=BIGINT}, #{roleId, jdbcType=BIGINT});
  </insert>
  <delete id="deleteRole" >
      DELETE FROM user_role
      WHERE 1=1
      AND userId=#{userId}
      AND roleId=#{roleId}
  </delete>

  <select id="getRoles" resultMap="UserResultMap">
      SELECT
      r.id AS id, r.name AS name
      FROM users AS  u
      LEFT JOIN user_role AS ur ON u.id = ur.userId
      LEFT JOIN roles AS r ON r.id = ur.roleId
      WHERE 1=1
        AND u.id = #{id,jdbcType=BIGINT}
        AND r.isActive = 1
        AND u.isActive = 1
  </select>

  <select id="getUsers" resultMap="RoleResultMap">
      SELECT
      u.id AS id, u.username AS username
      FROM roles AS  r
      LEFT JOIN user_role AS ur ON r.id = ur.roleId
      LEFT JOIN users AS u ON u.id = ur.userId
      WHERE 1=1
      AND r.id = #{id,jdbcType=BIGINT}
      AND r.isActive = 1
      AND u.isActive = 1
  </select>
vvppvyoh

vvppvyoh2#

请看一下文档中的嵌套Resultmaps部分。
这应通过类似于以下内容的结果图来实现

<resultMap id="xx" type="map"> 
    <association id="key1" javaType="bean1" /> 
    <collection id="key2" ofType="bean2" /> 
</resultMap>
p8ekf7hl

p8ekf7hl3#

大家可以看看我的repository里面有一个例子。

相关问题