一对一
前提条件
什么时候会用到一对一?
- 假设有两张表,一张用户表,一张账号表,用户只能有一个账户,而用户信息和账户信息都放到一张表里就很显得数据很冗余。所以就分出来两张表。
- 假设一款游戏,要做登录验证,用户名和密码就可以单独出来一个表,因为登录的时候只查询的是用户名和密码,所以单独一个表出来是最佳方案,这样查询速度快, 同时用户密码表也要关联上用户信息表。
一对一设计的两种方案
- 主键共享 (pk+fk)
- 外键唯一 (fk+unique)
一对一查询
一对一查询有两种方式
1. 创建子类 (不常用)
2. 从表中有实体引用(常用)
准备环境
现在有两种表,一张用户名(从表),一张账户表(主表)
- 从表实体类中应该含一个主表实体的包对象引用
public class Account {
private Integer id;
private Integer uid;
private Double money;
//从表实体类中应该有一个主表的对象
private User user;
//提供getset方法 该重写的方法重写了
}
- 准备的SQL语句
select
a.*,u.id,u.name,u.password
from
account a
join
user u
on
a.uid = u.id
- 因为Account(子表)表中有一个主表的对象,那么再查询结果封装的时候是 没办法把User封装进去的,需要这样设置(在映射文件中写 resultMap)
<!--定义一个能封装account和user的resultMap-->
<resultMap id="accountUserMap" type="Account">
<!--定义主键字段-->
<id property="id" column="id"></id>
<!--定义非主键字段-->
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射:配置user的内容-->
<!--property:该实体类中的哪个对应关系的主表属性-->
<!--column:通过哪一个 字段进行获取的-->
<!--javaType:最后的结果封装到哪个类 正常写法是com.xxx.xx 用了TypeAlia..所以直接类名-->
<association property="user" column="uid" javaType="User">
<!--在里面写User的属性和数据库对应起来-->
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="password" column="password"></result>
</association>
</resultMap>
- sql语句原封不动的写就行 (这里写上 resultMap起的id名)
<select id="findAll" resultMap="accountUserMap">
select
a.*,u.id,u.name,u.password
from
account a
join
user u
on
a.uid = u.id
</select>
这样就能查询出来了
下一篇更新: 多表查询 一对多查询