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
    评论
MyBatis是一款支持关联查询的ORM框架,可以通过XML或注解的方式来实现关联查询。以下是一个示例: 假设我们有两个表,一个是用户表(user),另一个是订单表(order),每个用户有多个订单。我们需要查询用户及其订单信息。 首先,我们需要在User类中定义一个List<Order>类型的属性,用于存储用户的订单信息: ``` public class User { private Integer id; private String username; private List<Order> orders; // getter和setter方法 } ``` 然后,在UserMapper.xml中编写关联查询的SQL语句: ``` <select id="selectUserById" resultMap="userMap"> select u.id, u.username, o.id as order_id, o.order_no, o.amount from user u left join order o on u.id = o.user_id where u.id = #{id} </select> <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <result property="amount" column="amount"/> </collection> </resultMap> ``` 在这个SQL语句中,我们使用了左连接将用户表和订单表进行关联。在resultMap中,我们使用了collection标签来表示User类中的orders属性是一个集合类型。在collection标签中,我们定义了Order类的属性和对应的列名。 最后,在UserMapper接口中定义selectUserById方法: ``` public interface UserMapper { User selectUserById(Integer id); } ``` 在这个方法中,MyBatis会自动执行我们定义的SQL语句,并将结果映射到User对象中,包括用户信息和订单信息。我们只需要通过调用User对象的getter方法就可以获取用户和订单信息了。 这就是使用MyBatis实现关联查询的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值