mybatis多表查询,一对一查询

一对一

前提条件

什么时候会用到一对一?

  1. 假设有两张表,一张用户表,一张账号表,用户只能有一个账户,而用户信息和账户信息都放到一张表里就很显得数据很冗余。所以就分出来两张表。
  2. 假设一款游戏,要做登录验证,用户名和密码就可以单独出来一个表,因为登录的时候只查询的是用户名和密码,所以单独一个表出来是最佳方案,这样查询速度快, 同时用户密码表也要关联上用户信息表。

一对一设计的两种方案

  1. 主键共享 (pk+fk)
  2. 外键唯一 (fk+unique)

一对一查询

一对一查询有两种方式
1. 创建子类 (不常用)
2. 从表中有实体引用(常用)

准备环境
现在有两种表,一张用户名(从表),一张账户表(主表)

  1. 从表实体类中应该含一个主表实体的包对象引用
public class Account {
    
    
	private Integer id;
	private Integer uid;
	private Double money;
	//从表实体类中应该有一个主表的对象
	private User user;
	//提供getset方法 该重写的方法重写了
}
  1. 准备的SQL语句
select
	a.*,u.id,u.name,u.password
from
	account a
join
	user u
on
	a.uid = u.id

  1. 因为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>

  1. 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>

这样就能查询出来了


下一篇更新: 多表查询 一对多查询

猜你喜欢

转载自blog.csdn.net/m0_46409345/article/details/108691166