持久层框架MyBatis学习(5)-mybatis关联关系

本秂侑毒 提交于 2019-11-30 09:30:39

一,商品订单数据模型

多角度看,一个订单可以关联一个一个用户,这是一对一。从用户角度的看,一个用户可以有多个订单,这是一对多关系。

二,一对一查询

查询所有订单信息,关联查询下单用户信息

1.方法一

使用resultType,定义订单信息pojo类,此pojo类中包括了订单信息和用户信息
1)定义一个pojo类:

public class OrdersUser {
	private int id;
	private int user_id;
	private String number;
	private Date createtime;
	private String note;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
//get/set方法。。。。

2)映射文件

<mapper namespace="com.djc.mybatis.mapper.OrdersMapper">
	<select id="findOrdersUserList" resultType="ordersUser" >
	 	SELECT o.*,u.username,u.birthday,u.sex,u.address FROM orders o LEFT JOIN USER u ON o.user_id = u.id
	</select>
</mapper>

3)接口

public List<OrdersUser> findOrdersUserList();

4)测试

@Test
 public void testFindOrdersUserList() {
   SqlSession sqlSession = sqlSessionFactory.openSession();
   OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
   List<OrdersUser> ordersUserList = mapper.findOrdersUserList();
   System.out.println(ordersUserList);
   sqlSession.close();
  }

2.方法二

使用resultMap,定义专门的resultMap用于映射一对一查询结果。
1)定义一个订单pojo类
在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

public class Orders {
	private int id;
	private int user_id;
	private String number;
	private Date createtime;
	private String note;
	private User user;
//get/set方法。。。。

2)映射文件

<resultMap id="ordersResultMap" type="orders" >
		<id column="id" property="id"/>
		<result column="" property="user_id"/>
		<result column="" property="number"/>
		<result column="" property="createtime"/>
		<result column="" property="note"/>
		<!-- 构建一对一关系 -->
		<association property="user" javaType="com.djc.mybatis.po.User">
		<id column="user_id" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>
			<result column="birthday" property="birthday"/>
			<result column="address" property="address"/>
		</association>
	</resultMap>
	
	<select id="findOrdersList" resultMap="ordersResultMap">
		select o.*,u.username,u.birthday,u.sex,u.address FROM orders o LEFT JOIN USER u ON o.user_id = u.id
	</select>

3)解释
association:表示进行关联查询单条记录
property:表示关联查询的结果存储在com.djc.mybatis.pojo.Orders的user属性中
javaType:表示关联查询的结果类型
< id property=“id” column=“user_id”/>:查询结果的user_id列对应关联对象的id属性,这里是< id />表示user_id是关联查询对象的唯一标识。
< result property=“username” column=“username”/>:查询结果的username列对应关联对象的username属性。

三,一对多查询

查询所有用户信息及关联的订单信息,用户信息和订单信息为一对多关系。
1)定义一个订单pojo类
在user类中加入一个属性

public class User implements Serializable {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	private List<Orders> orders;
//get/set方法。。。。

2)映射文件

<resultMap type="user" id="userResultMap">
	<id column="id" property="id"/>
	<result column="username" property="username"/>
	<result column="sex" property="sex"/>
	<result column="birthday" property="birthday"/>
	<result column="address" property="address"/>
	<collection property="orders" ofType="orders">
		<id column="oid" property="id"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		<result column="note" property="note"/>
	</collection>
</resultMap>

<select id="findUserList" resultMap="userResultMap">
	SELECT u.*,o.id oid,o.number,o.createtime,o.note FROM USER u LEFT JOIN orders o ON u.id = o.user_id
</select>

3)解释
collection:部分定义了用户关联的订单信息。表示关联查询结果集
property=“orders”:关联查询的结果集存储在User对象的上哪个属性。
ofType=“orders”:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
< id />及< result/>的意义同一对一查询。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!