Java框架_Mybatis框架7_关联查询

    首先关于数据库关联查询的相关知识这里就不赘述了,仅仅说明在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);
		}
	}

测试结果:

猜你喜欢

转载自blog.csdn.net/m0_37808093/article/details/81140759
今日推荐