两表关系:
1.Mybatis中一对一关系
1 <!-- 两表联查,通过相同属性user_id 2 left join 表示以左边的表为主表 3 --> 4 <select id="findOrdersByUser" parameterType="User" resultMap="orders_user"> 5 select 6 o.id, 7 o.number, 8 o.createtime, 9 o.user_id, 10 u.username, 11 u.address 12 from orders o 13 left join user u 14 on o.user_id = u.id 15 </select>
一对一查询的sql代码,这里采用的是resultMap方式查询,即在Orders类中定义一对一的User对象 private User user;
1 <!-- (均采用别名方式) 2 type:返回类型,同时也是主要依照的表 3 注意:在一对一关联中不能省略属性 4 association:一对一标签 5 property:在Orders类中对应User的属性名,Orders与type中的类型需一致 6 javaType:该一对一关系,对应的pojo类 8 --> 9 <resultMap type="Orders" id="orders_user"> 10 <id column="id" property="id"/> 11 <result column="number" property="number"/> 12 <result column="createtime" property="createtime"/> 13 <result column="user_id" property="userId"/> 14 15 <association property="user" javaType="User"> 16 <id column="user_id" property="id"/> 17 <result column="username" property="username"/> 18 <result column="address" property="address"/> 19 </association> 20 </resultMap>
注意:id标签表示唯一性,一般是选取该表的id字段,当出现一对一、一对多关系时涉及2个id,那么可以选取表中(能访问的任意属性)能够表示该表唯一性的属性放在id标签中,上面代码此时order表中user_id字段与user表中id一致,故可以作为唯一性标志,若只能找到该表的id为唯一性属性,同时另一张表中已采用id为唯一标签,此时可以对id进行别名区别。别名操作在sql语句中执行。
2.Mybatis中一对多关系
一对多关系与一对一相似,主要在标签方面有些区别
1 <!-- 此次将user表作为主表,主表中不可能出现重复id --> 2 <select id="findUserByOrders" parameterType="Orders" resultMap="user_orders"> 3 select 4 o.id, 5 o.number, 6 o.createtime, 7 u.id uid, 8 u.username, 9 u.address 10 from user u 11 left join orders o 12 on o.user_id = u.id 13 </select>
1 <resultMap type="User" id="user_orders"> 2 <id column="uid" property="id"/> 3 <result column="username" property="username"/> 4 <result column="address" property="address"/> 5 6 <!-- 一对多中不能简单地将javaType赋为Orders类型 7 此时Mybatis不能自动区别是否为集合属性,此时须通过ofType设置属性类型 8 --> 9 <collection property="order" ofType="Orders"> 10 <id column="id" property="id"/> 11 <result column="number" property="number"/> 12 <result column="createtime" property="createtime"/> 13 </collection> 14 </resultMap>