一、简述
两张表关联,一张表插入一条新数据,另外一张表也跟着插入一条新数据。关键就是关联表获取到前者新增数据的主键值。
二、如何获取自动生成的(主)键值?
insert 方法总是返回一个 int 值该值表示的是插入的行数
。而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
示例:
<insert id="insertName" usegeneratedkeys="true" keyproperty="id">
insert into names (name) values (#{name})
</insert>
关键在于:useGeneratedKeys="true" keyProperty="id"
。
Name name = new Name();
name.setName(“fred”);
int rows = mapper.insertName(name);
//完成后,id已经被设置到对象中
system.out.println("rows inserted = " + rows);
system.out.println("generated key value = " + name.getId());
三、以角色权限模块中增加功能为例
- 概念
连带操作:首先在 Role 表中插入一条数据,拿到 rid,接着往 Role-Acl 表中插入一条数据。
- 数据库设计
Role 表
Role-Acl 表
- 代码实现
RoleMap
/**
* 新增角色
*/
@Insert("insert into sys_role(rolename,creator,createtime,remark) VALUES(#{rolename},1,NOW(),#{remark})")
@Options(useGeneratedKeys = true, keyProperty = "rid",keyColumn="rid")
int addRole(SysRole sysRole);
RoleAclMap
/**
* 插入到角色权限表
*/
@Insert("INSERT into sys_role_acl(rid,aid) VALUES(#{rid},#{aid})")
int addRoleAcl(SysRoleAcl sysRoleAcl);
RoleService
public Map addRole(SysRole sysRole, String[] aids) {
int addRole = m_RoleMap.addRole(sysRole);
Integer rid = sysRole.getRid();
// SysRoleAcl
SysRoleAcl sysRoleAcl = new SysRoleAcl();
sysRoleAcl.setAid(Arrays.toString(aids));
sysRoleAcl.setRid(rid);
m_RoleAclMap.addRoleAcl(sysRoleAcl);
// 调用IRoleAclMap方法
Map tResultMap = new HashMap();
tResultMap.put("status", "fail");
if (addRole <= 0) {
tResultMap.put("Msg", "添加失败");
return tResultMap;
}
tResultMap.put("status", "success");
return tResultMap;
}