Mybatis 多对多关联表关联 如何插入关联表数据

很多时候我们会碰到这样一个需求,当前我有(用户)表和(角色)表,他们之间是多对多的关系,所以我们通常会创建一个关联表(用户_角色)表,现在我们有固定的角色,只需要添加用户即可,给用户指定角色,那我们怎么做呢,废话不多说了,下面给出思路:


        表 :user   /   role   /   user_role 


对应JavaBean如下:

用户表:


public class User implements Serializable {
 
    // Fields
 
    private Integer id;
    private String login;
    private String name;
    private String pass;
    private String phone;
    private String email;
    private Integer isadmin;
 
       // get...set...
}

角色表:
public class Role implements Serializable {
 
    // Fields
 
    private Integer roleId;
    private String roleName;
    private Date createdTime;
    private Date updateTime;
 
    //get...set...
}

用户_角色关联表(当然,它不创建也可以):
public class UserRole implements Serializable {
 
    // Fields
 
    private Integer id;
    private Integer userId;
    private Integer roleId;
 
    //get...set...
}

//**以下所有操作中,所有JavaBean使用别名(typeAlias)方式,不会的话自行百度
需求,添加用户并为当前用户指定多个角色,主要Sql:

1: 首先插入用户(实现插入用户并且返回插入用户的主键):

<insert id="save" parameterType="User" useGeneratedKeys="true"
        keyProperty="id">
        insert into user(login,name,pass,phone,email,isadmin)
        values(#{login},#{name},#{pass},#{phone},#{email},${isadmin})
</insert>
//useGeneratedKeys="true" 设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的主键字段中
//keyProperty="id"  指定JavaBean的主键字段


2:为用户匹配角色:

方式一(适用于除了插入被关联表的ID,还要插入被关联表中的其他信息,例如:角色类型( 当前设计中此字段不存在,仅仅用于举例子)):

<insert id="saveUserOrRole" parameterType="map">
        insert into user_role(
        user_id,role_id,role_type
        )
        select u.id,r.role_id,r.role_type from user u,role r where
        u.id = ${userId} and
        r.role_id in
        <foreach collection="roleIds" item="rId" open="(" separator=","
            close=")">
            #{rId}
        </foreach>
</insert>


方式二(适用于只需要插入被关联表的ID)

insert into user_role(
        user_id,role_id
        ) values
        <foreach collection="roleIds" item="rId" separator=",">
            (${userId},#{rId})
        </foreach>
//注意在执行完第一条插入用户sql后,在外部访问对象User的主键是已经存在的,类似hibernate持久化后对象已经拥有ID信息

这里把测试代码给出(Junit4):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:spring-*.xml")
public class TestSSM {
    @Resource
    protected UserMapper userMapper;
    
    
    @Test
    public void testInsert() {
        User user = new User();
        user.setEmail("yhq1913@sina.com");
        user.setLogin("ytzl");
        user.setName("云图智联");
        //密码加密
        user.setPass(DigestUtil.hmacSign("ytzl", "yuntuzhilian"));
        user.setPhone("15910721339");
        user.setIsadmin(1);
        userMapper.save(user);
        Map<String, Object> saveParams = new HashMap<>();
        saveParams.put("userId", user.getId());
        //这里指定两个角色的ID进行测试
        saveParams.put("roleIds", Arrays.asList("1", "2"));
        userMapper.saveUserOrRole(saveParams);
    }
}

转载:https://blog.csdn.net/yhq1913/article/details/64128441 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值