- 外键的作用是什么,外键加在两个关联表的那一边。
作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
外键放在哪一个表中:分为下面几种情况:
- 首先,外键引用的那个列在主表中必须是主键列或者唯一列。
- 所以1:n的肯定把外键建立在n的那张表上。
- 1:1,一般要看谁是主表,谁是附属表,外键当然建立在附属表中。
- n:m的情况,需要建立一个关系表, 两个原表和其关系分别是1:n,1:m
例子(多对多):
角色表
用户表
联系表(外键设在这里)
外键放在联系表中。
- mybatis的多对多嵌套查询
作用:使用mybatis时,当我们遇到表与表之之间存在关联的时候,就可以使用嵌套查询
还是使用上面的例子:
public class UserInfo {
private String uid;
private String username;
private String name;
private String password;
private String salt;
private Integer state;
//新建一个roles,用来接受联系表的数据
private List<SysUserRoleKey> roles;
public List<SysUserRoleKey> getRoles() {
return roles;
}
public void setRoles(List<SysUserRoleKey> roles) {
this.roles = roles;
}
}
public class SysUserRoleKey {
private String roleId;
private String uid;
//与role的类是一对一的关系
private SysRole role;
private UserInfo userInfos;
}
resultMap
<resultMap id="UserAndRole" type="com.example.demo.Model.UserInfo">
<id column="uid" jdbcType="VARCHAR" property="uid" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="salt" jdbcType="VARCHAR" property="salt" />
<result column="state" jdbcType="INTEGER" property="state" />
<collection property="roles" ofType="com.example.demo.Model.SysUserRoleKey">
<id column="role_id" jdbcType="VARCHAR" property="roleId" />
<id column="uid" jdbcType="VARCHAR" property="uid" />
<association property="role" javaType="com.example.demo.Model.SysRole">
<id column="role_id" jdbcType="VARCHAR" property="roleId" />
<result column="available" jdbcType="INTEGER" property="available" />
<result column="description" jdbcType="VARCHAR" property="description" />
<result column="role" jdbcType="VARCHAR" property="role" />
</association>
</collection>
</resultMap>
查询语句
</select>
<select id="selectUserRole" resultMap="UserAndRole" parameterType="java.lang.String">
select sr.role_id ,sr.available,sr.description,sr.role,各种你需要的属性
FROM user_info u
left join sys_user_role sur ON u.uid=sur.uid
left join sys_role sr ON sur.role_id=sr.role_id
</select>