//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);
}
}
结构图如下