MyBatis-Plus 本身主要关注单表操作,但可以通过几种方式实现一对多关联查询:
1. 使用 XML 映射文件实现
这是最传统的方式,通过编写 SQL 和 ResultMap 实现:
XML
<!-- UserMapper.xml -->
<resultMap id="userWithOrdersMap" type="com.example.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 一对多关联 -->
<collection property="orders" ofType="com.example.Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="userId" column="user_id"/>
</collection>
</resultMap>
<select id="selectUserWithOrders" resultMap="userWithOrdersMap">
SELECT u.*, o.id as order_id, o.order_no, o.user_id
FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
2. 使用注解方式实现
MyBatis 也支持通过注解实现:
java
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(id=true, property="id", column="id"),
@Result(property="name", column="name"),
@Result(property="orders", column="id",
many=@Many(select="com.example.mapper.OrderMapper.selectByUserId"))
})
User selectUserWithOrders(Long id);
}
public interface OrderMapper extends BaseMapper<Order> {
@Select("SELECT * FROM order WHERE user_id = #{userId}")
List<Order> selectByUserId(Long userId);
}
3. 使用 MyBatis-Plus 的关联查询插件
可以集成第三方插件如 mybatis-plus-join
:
java
// 添加依赖后使用
public List<User> getUserWithOrders() {
return joinLambdaWrapper(User.class)
.leftJoin(Order.class, Order::getUserId, User::getId)
.selectAll(User.class)
.selectAs(Order::getId, User::getOrderId)
.selectAs(Order::getOrderNo, User::getOrderNo)
.list();
}