很多时候我们会碰到这样一个需求,当前我有(用户)表和(角色)表,他们之间是多对多的关系,所以我们通常会创建一个关联表(用户_角色)表,现在我们有固定的角色,只需要添加用户即可,给用户指定角色,那我们怎么做呢,废话不多说了,下面给出思路:
表 :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...
}
需求,添加用户并为当前用户指定多个角色,主要Sql:
1: 首先插入用户(实现插入用户并且返回插入用户的主键):
insert into user(login,name,pass,phone,email,isadmin)
values(#{login},#{name},#{pass},#{phone},#{email},${isadmin})
//useGeneratedKeys="true"
设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的主键字段中
//keyProperty="id" 指定JavaBean的主键字段
2:为用户匹配角色:
方式一(适用于除了插入被关联表的ID,还要插入被关联表中的其他信息,例如:角色类型( 当前设计中此字段不存在,仅仅用于举例子)):
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
#{rId}
方式二(适用于只需要插入被关联表的ID)
insert into user_role(
user_id,role_id
) values
(${userId},#{rId})
//注意在执行完第一条插入用户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("[email protected]");
user.setLogin("ytzl");
user.setName("云图智联");
//密码加密
user.setPass(DigestUtil.hmacSign("ytzl", "yuntuzhilian"));
user.setPhone("15910721339");
user.setIsadmin(1);
userMapper.save(user);
Map saveParams = new HashMap<>();
saveParams.put("userId", user.getId());
//这里指定两个角色的ID进行测试
saveParams.put("roleIds", Arrays.asList("1", "2"));
userMapper.saveUserOrRole(saveParams);
}
}
//测试结果:数据成功插入。