1.多表查询之间的关系
表关系有一对一,一对多,多对一,多对多四种.
但多表查询之间关系分为两种:一对多(一个客户可能会有多个订单)与一对一(一个订单对应一个客户).
这是因为查询是单向的,即我们在查询时只能从一方出发去寻找另一方,即我们不能使用多个内容进行查找.
2.一对一的多表查询
多表查询与单表查询的区别在于多表查询的返回值中会包含别的类的对象的信息,比如从订单查询一个用户,传入的是订单信息返回的是用户信息,因此多表查询必须在订单类中包含用户类,即包含一个指向用户对象的指针.
但是Mybatis并不会自动把得到的关于用户的信息放入订单的用户指针中,因此需要手动进行映射.
<ResultMap id="自定义一个名字" Type="返回值类">
#注意这里的Type是应该返回什么?比如用订单找客户,返回类型一定是订单,因为用户信息是包含在订单中的,
#所以这里的Type也可以认为是用哪个类去寻找就用写那个类.
<id column="数据库中的列名" property="类的属性名" />#id中是主键对应的列
<result column="数据库中的列名" property="类的属性名" />#result中是普通列
<result ...>
<association property="这个类中含有的其他类的指针的名称" Type="其他类的别名">
<id...>#将指针的属性也进行对应
<result...>
</association>
</ResultMap>
<select id="接口中的函数名" ResultMap="上方自定义的名字">
sql语句
</select>
3.一对多的多表查询
与单表查询类似,仅仅把association换成了collection
<ResultMap id="自定义一个名字" Type="返回值类">
<id column="数据库中的列名" property="类的属性名" />#id中是主键对应的列
<result column="数据库中的列名" property="类的属性名" />#result中是普通列
<result ...>
<collection property="这个类中含有的其他类的指针的名称" ofType="集合中的的类(类的泛型)">
<id...>#将指针的属性也进行对应
<result...>
</collection>
</ResultMap>
<select id="接口中的函数名" ResultMap="上方自定义的名字">
sql语句
</select>
4.对单向查询的补充
以用户与订单为例,要以用户寻找订单,用户中就要有订单的指针,要用订单寻找用户,订单中就有用户的指针,二者互相含有.
在映射时,从用户查询订单,在association时发现订单中又会出现用户指针,此时就不要再对用户指针进行映射了,因为这样会导致死循环.
这也是单向查询的原因,即从用户查找订单,就订单只映射自己的内容.