mybatis-plus一对多关联查询
MyBatis-Plus 本身主要关注单表操作,但可以通过几种方式实现一对多关联查询:
1. 使用 XML 映射文件实现
这是最传统的方式,通过编写 SQL 和 ResultMap 实现:
<!-- 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_idFROM user uLEFT JOIN order o ON u.id = o.user_idWHERE u.id = #{id}
</select>
2. 使用注解方式实现
MyBatis 也支持通过注解实现:
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
:
// 添加依赖后使用
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();
}