MyBatis:关联查询

一对一查询

方法一,定义包装类pojo作为输出类型

OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字段,只需要定义User类字段即可。

public class OrdersCustom extends Orders {

	private String username; //用户名称
public class Orders {

	private Integer oid;
	private String name;
	private Integer userId;
<select id="findOrdersList" resultType="org.haiwen.pojo.OrdersCustom">
    SELECT
    	`user`.username,
    	orders.*
    FROM
    	`user`,
    	orders
    WHERE
    	`user`.uid = orders.user_id
</select>
public List<OrdersCustom> findOrdersList() throws Exception;
@Test
public void testFindOrdersList() throws Exception {
	SqlSession sqlSession = sqlSessionFactory.openSession();
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	List<OrdersCustom> list = userMapper.findOrdersList();
	System.out.println(list);
	sqlSession.close();
}

方法二,使用association进行关联查询

public class Orders {

	private Integer oid;
	private String name;
	private Integer userId;
	private User user;
<select id="findOrdersListResultMap" resultMap="userordermap">
    SELECT
    	`user`.username,
    	orders.*
    FROM
    	`user`,
    	orders
    WHERE
    	`user`.uid = orders.user_id
</select>

<resultMap type="org.haiwen.pojo.Orders" id="userordermap">
	<!-- 这里的id,是mybatis在进行一对一查询时将order字段映射为order对象时要使用,必须写 -->
	<id property="oid" column="oid" />
	<result property="name" column="name" />
	<result property="userId" column="user_id" />
	<association property="user" javaType="org.haiwen.entity.User">
		<id property="uid" column="uid" />
		<result property="username" column="username" />
	</association>
</resultMap>

association:表示进行关联查询单条记录

property:表示关联查询的结果存储在org.haiwen.pojo.Orders的user属性中

javaType:表示关联查询的结果类型

<id property="id" column="id"/>:查询结果的id列对应关联对象的id属性,这里是id表示关联查询对象的唯一标识。

<result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。

public List<Orders> findOrdersListResultMap() throws Exception;
@Test
public void testFindOrdersListResultMap() throws Exception {
	SqlSession sqlSession = sqlSessionFactory.openSession();
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	List<Orders> list = userMapper.findOrdersListResultMap();
	System.out.println(list);
	sqlSession.close();
}

一对多查询

方法一,使用collection进行关联查询

public class Orders {

	private Integer oid;
	private String name;
	private Integer userId;
	private User user;
	private List<OrdersDetail> ordersDetail;
public class OrdersDetail {

	private Integer odid;
	private Integer num;
	private Integer ordersId;
<select id="findOrdersDetailList" resultMap="userordersdetailmap">
	SELECT
		*
	FROM
		`user`,
		orders,
		ordersdetail
	WHERE
		`user`.uid = orders.user_id
	AND orders.oid = ordersdetail.orders_id
</select>

<resultMap type="org.haiwen.pojo.Orders" id="userordersdetailmap">
	<id property="oid" column="oid" />
	<result property="name" column="name" />
	<result property="userId" column="user_id" />
	<association property="user" javaType="org.haiwen.entity.User">
		<id property="uid" column="uid" />
		<result property="username" column="username" />
	</association>
	<collection property="ordersDetail" ofType="org.haiwen.pojo.OrdersDetail">
		<id property="odid" column="odid" />
		<result property="num" column="num" />
		<result property="ordersId" column="orders_id" />
	</collection>
</resultMap>

collection:表示关联查询结果集

property="ordersDetail":关联查询的结果集存储在org.haiwen.pojo.Orders的ordersDetail属性中

ofType="org.haiwen.pojo.OrdersDetail":指定关联查询的结果集中的对象类型即List中的对象类型。

public List<Orders> findOrdersDetailList() throws Exception;
@Test
public void testFindOrdersDetailList() throws Exception {
	SqlSession session = sqlSessionFactory.openSession();
	UserMapper userMapper = session.getMapper(UserMapper.class);
	List<Orders> list = userMapper.findOrdersDetailList();
	for (Orders orders : list) {
		System.out.println(list);
	}
	session.close();
}

方法二,使用extends继承订单信息userordermap

上边定义的resultMap中除了collection标签,和一对一查询订单信息的resultMap相同,这里使用继承可以不再填写重复的内容,如下:

<resultMap type="org.haiwen.pojo.Orders" id="userordersdetailmap" extends="userordermap">
	<collection property="ordersDetail" ofType="org.haiwen.pojo.OrdersDetail">
		<id property="odid" column="odid" />
		<result property="num" column="num" />
		<result property="ordersId" column="orders_id" />
	</collection>
</resultMap>

多对多查询

public class User {

	private Integer uid;
	private String username;
	private List<Orders> orders;
public class Orders {

	private Integer oid;
	private String name;
	private List<OrdersDetail> ordersDetail;
public class OrdersDetail {

	private Integer odid;
	private Integer num;
	private Items items;
public class Items {

	private Integer iid;
	private String itemsName;
	private String itemsNum;
	private Integer ordersdetailId;

需要关联查询映射的信息是:订单、订单明细、商品信息

订单:一个用户对应多个订单,使用collection映射到用户对象的订单列表属性中

订单明细:一个订单对应多个明细,使用collection映射到订单对象中的明细属性中

商品信息:一个订单明细对应一个商品,使用association映射到订单明细对象的商品属性中

<select id="findAllItems" resultMap="userOrderListResultMap">
	SELECT
		`user`.username,
		orders.`name`,
		ordersdetail.num,
		items.items_name,
		items.items_num
	FROM
		`user`,
		orders,
		ordersdetail,
		items
	WHERE
		`user`.uid = orders.user_id
	AND orders.oid = ordersdetail.orders_id
	AND ordersdetail.odid = items.ordersdetail_id
</select>

<resultMap type="org.haiwen.entity.User" id="userOrderListResultMap">
<id property="uid" column="uid" />
<result property="username" column="username" />
<collection property="orders" ofType="org.haiwen.pojo.Orders">
	<id property="oid" column="oid" />
	<result property="name" column="name" />
	<collection property="ordersDetail" ofType="org.haiwen.pojo.OrdersDetail">
		<id property="odid" column="odid" />
		<result property="num" column="num" />
		<association property="items" javaType="org.haiwen.pojo.Items">
			<id property="iid" column="iid" />
			<result property="itemsName" column="items_name" />
			<result property="itemsNum" column="items_num" />
		</association>
	</collection>
</collection>
</resultMap>
public List<User> findAllItems() throws Exception;
@Test
public void testFindAllItems() throws Exception {
	SqlSession session = sqlSessionFactory.openSession();
	UserMapper userMapper = session.getMapper(UserMapper.class);
	List<User> list = userMapper.findAllItems();
	for (User user : list) {
		System.out.println(list);
	}
	session.close();
}

小结

resultType:

作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

对结果有特殊的映射要求时,使用association和collection完成一对一和一对多高级映射。

association:

作用:将关联查询信息映射到一个pojo对象中。

场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

collection:

作用:将关联查询信息映射到一个list集合中。

场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

如果使用resultType无法将查询结果映射到list集合中。

发布了202 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/102496058