MyBatis之关联对象查询

//UserMapper.xml
<mapper namespace="com.mapper.UserMapper">
	<!--
	案例一:
	需求:关联查询对象数据 
		查询订单的时候关联查询用户信息 
		嵌套结果集映射
		 查询两张表
	  -->
	<select id="selectOrderWithUser" parameterType="long"
		resultMap="orderWithUserMap">
		select * from tb_order as o left outer join tb_user as u on u.uid=o.oid
		where o.oid=#{oid}
	</select>

	<!--定义resultMap: -->
	<resultMap type="order" id="orderWithUserMap" extends="orderResultMap">
		<!--配置关联的对象 
		 property:订单对象里面的user类型的成员变量名
		 column:外键字段 ,可省略不写 
		 javaType:user的类型  可以写别名 
		-->

		<association property="user" column="uid" javaType="user" resultMap="userResultMap">
		</association>

	</resultMap>
	
	<!--定义userMap -->
	<resultMap type="user" id="userResultMap">
		<id column="uid" property="uid" />
		<result column="uname" property="uname" />
		<result column="upwd" property="upwd" />
		<result column="sex" property="sex" />
	</resultMap>
	
	<!--定义orderMap -->
	<resultMap type="order" id="orderResultMap">
		<id column="oid" property="oid" />
		<result column="oname" property="oname" />
		<result column="price" property="price" />
	</resultMap>
	
	
	<!--
	案例二:
	需求:关联查询对象数据 
		查询订单的时候关联查询用户信息 
		嵌套查询映射
		 查询一张表
	  -->
	<select id="selectOrderWithUser2" parameterType="long"
		resultMap="orderWithUserMap2">
		select * from tb_order where oid=#{oid}
	</select>
	<!-- orderWithUserMap2 -->
	<resultMap type="order" id="orderWithUserMap2" extends="orderResultMap">
		<association property="user" column="uid" javaType="user" select="selectUserByUid"></association>
	</resultMap>
	<select id="selectUserByUid" parameterType="long" resultType="user">
		select * from tb_user where uid=#{uid}
	</select>
	
	<!--案例3
		查询用户的时候去关联查询属于该用户的订单集合
		嵌套结果映射
		查询两张表
	
	  -->
	<select id="selectUserWithOrders" parameterType="long" resultMap="UserOrdersMap">
		select * from tb_user as u left outer join tb_order as o on u.uid=o.uid where u.uid=#{uid}
	</select>
	<!-- UserOrdersMap -->
	<resultMap type="user" id="UserOrdersMap" extends="userResultMap">
		<!--配置关联集合
		property:orders
		ofType:集合中的泛型的类型
		  -->
		<collection property="orders" ofType="order" resultMap="orderResultMap"></collection>
		
	</resultMap>
	<!--案例4
		查询用户的时候去关联查询属于该用户的订单集合
		嵌套查询映射
		查询一张表
	
	  -->
	  <select id="selectUserWithOrders2" parameterType="long" resultMap="UserOrdersMap2">
	  	select * from tb_user where uid=#{uid}
	  </select>
	  
	  <resultMap type="user" id="UserOrdersMap2" extends="userResultMap">
	  	<collection property="orders" column="uid" ofType="order" select="selectOrdersByUid"></collection>
	  </resultMap>
	  
	  <select id="selectOrdersByUid" parameterType="long" resultMap="orderResultMap">
	  	select * from tb_order where uid=#{uid}
	  </select>
	
</mapper>
UserMapper.java
public interface UserMapper {

	Order selectOrderWithUser(Long oid);
	Order selectOrderWithUser2(Long oid);
	User selectUserWithOrders(Long uid);
	User selectUserWithOrders2(Long uid);
}

pojo对象

public class User {

	private Long uid;
	private String uname;
	private String upwd;
	private String sex;
	private List<Order> orders = new ArrayList<>();
    getter and setter...
}
public class Order {

	private Long oid;
	private String oname;
	private Double price;
	//关联一方
	private User user;
    getter and setter...
}

测试代码

public class Demo {
	
	private SqlSession sqlSession;
	
	@Before
	public void init() throws IOException{
		String path = "SqlMapConfig.xml";

		// 加载配置文件
		InputStream in = Resources.getResourceAsStream(path);
		// 获取SqlSessionFactory工厂
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
		//sqlSession会自动帮我们开启事务
		sqlSession = factory.openSession();
	}
	@After
	public void after(){
		sqlSession.commit();
		sqlSession.close();
	}

	/**
	 * 
	 *案例一:
	需求:关联查询对象数据 
		查询订单的时候关联查询用户信息 
		嵌套结果集映射
		 查询两张表
	 * 
	 */
	@Test
	public void run1(){
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		Order order = mapper.selectOrderWithUser(1L);
		System.out.println(order);
	}
	/**
	 * 
	 *案例二:
	需求:关联查询对象数据 
		查询订单的时候关联查询用户信息 
		嵌套查询映射
		 查询一张表
	 * 
	 */
	@Test
	public void run2(){
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		Order order = mapper.selectOrderWithUser2(1L);
		System.out.println(order);
	}
	/**
	 * 
	 *案例三:
	需求:关联查询对象数据 
		查询用户的时候关联查询订单
		嵌套查询映射
		 查询两张表
	 * 
	 */
	@Test
	public void run3(){
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = mapper.selectUserWithOrders(1L);
		System.out.println(user);
	}
	/**
	 * 
	 *案例四:
	需求:关联查询对象数据 
		查询用户的时候关联查询订单
		嵌套查询映射
		 查询两张表
	 * 
	 */
	@Test
	public void run4(){
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = mapper.selectUserWithOrders2(1L);
		System.out.println(user);
	}
}

结构图如下


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值