- 需求:查询用户的详情,同时查询关联的订单。
3.2.0 JavaBean
-
修改User对象,添加对应的订单属性
@Data public class User { private String uid; private String username; // 一对多:一个用户拥有【多个订单】 private List<Order> orderList; }
3.2.1 方式1:硬编码
-
依次查询两个mapper,获得需要的数据,然后手动拼凑。
-
修改测试类
@Test
public void testSelectAll() {
// 获得会话
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 获得处理类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 执行
List<User> userList = userMapper.selectAll();
for(User user: userList) {
// 每一个用户依次查询,并封装
List<Order> orderList = orderMapper.selectAllByUid(user.getUid());
user.setOrderList(orderList);
}
// 打印【用户中含有订单】
userList.forEach(System.out::println);
// 释放
MybatisUtils.close(sqlSession);
}
3.2.2 方式2:注解关联
- 修改 UserMapper,添加 @Results 完成关联查询的配置
public interface UserMapper {
/*
@Results:用于配置一个JavaBean与一个表的对应关系
@Result:JavaBean的一个属性 和 表的一个列的对应关系
property:JavaBean的属性名
column:表中列的名
many:用于配置一对多关系的
@Many(select=“另一个mapper对应的方法”)
mapper对应的方法要求:包名.类名.方法名
此时column设置就是方法的实际参数
注意:
1. property和column的值相同时,@Result可以省略
2. 每一个column只能使用一次,如果出现多次,就需要配置多个@Result
*/
/**
* 查询所有
* @return
*/
@Select("select * from user")
@Results({
@Result(property = "uid", column = "uid" ),
@Result(property = "username", column = "username"),
@Result(property = "orderList", many = @Many(select = "com.czxy.mapper.OrderMapper.selectAllByUid"), column = "uid")
})
public List<User> selectAll();
## 多对一
* 需求:查询订单的同时,查询订单所属用户。
### 3.3.0 JavaBean
~~~java
package com.czxy.domain;
import lombok.Data;
/**
* @author 桐叔
* @email liangtong@itcast.cn
* @description
*/
@Data
public class Order {
private String oid;
private Double price;
private String userId;
//多对一:多个订单属于【一个用户】
private User user;
}
/*
create table `order`(
oid varchar(20) primary key,
price double,
user_id varchar(20)
);
*/
3.3.1 方式1:硬编码
-
驼峰映射:JavaBean的
userId
与数据库表的列user_id
自动的映射<!-- 驼峰映射 --> <setting name="mapUnderscoreToCamelCase" value="true"/>
-
修改测试类
public class TestOrderMapper { @Test public void testSelectAllByUid() { // 获得会话 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 获得处理类 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 执行 List<Order> orderList = orderMapper.selectAllByUid("u001"); for(Order order: orderList) { User user = userMapper.selectById(order.getUserId()); order.setUser(user); } // 打印 orderList.forEach(System.out::println); // 释放 MybatisUtils.close(sqlSession); } }
3.3.2 方式2:注解关联
- 修改 OrderMapper.java 添加
@Results
注解 配置多对一
public interface OrderMapper {
/**
* 通过id查询详情
* @param oid
* @return
*/
@Select("select * from `order` where oid = #{oid}")
@Results({
@Result(property = "oid", column = "oid"),
@Result(property = "price", column = "price"),
@Result(property = "userId", column = "user_id"),
@Result(property = "user", one = @One(select = "com.czxy.mapper.UserMapper.selectById"), column = "user_id" )
})
public Order selectById(@Param("oid") String oid);
}
3.3.3 方式3:XML关联
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czxy.mapper.OrderMapper">
<resultMap id="orderResultMap" type="com.czxy.domain.Order">
<id property="oid" column="oid"></id>
<result property="price" column="price"></result>
<result property="userId" column="user_id"></result>
<!-- 多对一配置
<association> 关联标签, 与 <collection>集合标签,配置内容类似
-->
<association property="user" select="com.czxy.mapper.UserMapper.selectById" column="user_id"></association>
</resultMap>
<!-- 通过id查询详情 -->
<select id="selectById" resultMap="orderResultMap">
select * from `order` where oid = #{oid}
</select>
<!-- 通过用户id查询用户的所有订单 -->
<select id="selectAllByUid" resultType="com.czxy.domain.Order">
select * from `order` where user_id=#{uid}
</select>
</mapper>