首先关于数据库关联查询的相关知识这里就不赘述了,仅仅说明在mybatis中如何实现,相关知识点推荐:
https://blog.csdn.net/u011277123/article/details/54863371/
※一个 用户表-订单表-商品表,三表关联的查询案例
两个需求:1.查询所有订单信息,并关联出查询下单的用户信息。
2.查询所有用户信息,并关联出用户的订单信息。
分析:对于需求1,一条订单信息,仅对应于一条用户信息,所以是一个一对一关系。而需求2,是一个一对多关系。
针对于需求建立数据模型后,设计出的数据库表结构如下,用一张关联表将orders和user关联。
测试数据库表:
items:
orders:
user:
关联表:
关联表的外键:
※首先针对需求1,可以先写出SQL语句:
SELECT orders.*,user.* FROM orders,user, WHERE orders.user_id=user.user_id;
由于user表中的user_id是作为orders表的外键的,所以体现在对象关系上,Orders实体对象上就需要有User实体对象的引用:
Orders:
public class Orders {
private int orderId;
private int count;
private int status;
private User user;
//省略get/set
}
而在Mapper文件中,我们可以使用association标签来实现一对一映射:
<mapper namespace="com.mybatis.mapper.OrdersMapper">
<select id="findOrdersAndUser" resultMap="ordersMap">
SELECT orders.*,user.* FROM orders,user WHERE orders.user_id=user.user_id;
</select>
<resultMap type="orders" id="ordersMap">
<id property="orderId" column="order_id"/>
<result property="count" column="count"/>
<result property="status" column="status"/>
<!-- 使用association标签将查询结果集的剩余字段映射封装到关联的pojo中 -->
<association property="user" javaType="user">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</association>
</resultMap>
</mapper>
association标签可以将查询结果集的剩余字段映射封装到关联的pojo中(即user)
测试:
@Test
public void testFindOrdersAndUser() throws Exception {
OrdersService ordersService = new OrdersServiceImpl();
List<Orders> list = ordersService.findOrdersAndUser();
for (Orders order : list) {
System.out.println(order);
}
}
测试结果:
※对于需求2,通过查询用户关联查询出订单信息,是一个一对多关系。
对于一对多,我们需要在“一”的实体类中(即User)关联一个“多”的实体对象的集合:
public class User {
private int userId;
private String username;
private String password;
private List<Orders> ordersList;
//省略get/set
}
而在Mapper中,使用collection标签来表示一对多映射:
<mapper namespace="com.mybatis.mapper.UserMapper">
<select id="findUserAndOrders" resultMap="userOrdersMap">
SELECT user.*,orders.* FROM user LEFT JOIN orders ON user.user_id=orders.user_id
</select>
<resultMap type="user" id="userOrdersMap">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<!-- collection标签用于进行一对多的高级映射,将关联查询的多条记录映射到pojo的list当中 -->
<collection property="ordersList" ofType="orders">
<id property="orderId" column="order_id"/>
<result property="count" column="count"/>
<result property="status" column="status"/>
</collection>
</resultMap>
</mapper>
collection标签可以将关联查询的多条记录映射到pojo的list中
测试:
@Test
public void testfindUserAndOrders() throws Exception {
UserService userService = new UserServiceImpl();
List<User> userList = userService.findUserAndOrders();
for (User user : userList) {
System.out.println(user);
}
}
测试结果: