MybatisPlus多表查询

数据准备

注意订单表不要直接取名order会与SQL关键字冲突
在这里插入图片描述

编写实体类

在这里插入图片描述
简单对应order_t表加上get、set即可,主键id最好用Integer类型
接下来首先来实现查询用户的时候把其所有订单查出来

给user实体类加上要它表查询的属性 orders

指定非表中数据【exist=false】,生成get、set
在这里插入图片描述
一定要生成get、set,否则Result中的orders拿不到selectByUid方法的返回值【没有set方法】
,前端也拿不到【没有get方法】

在这里插入图片描述
这里的@Resuts等于是做了一个拼接

编写Mapper类

UserMapper

package cn.itsp.demo.mapper;

import cn.itsp.demo.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper extends BaseMapper<User> {

//查询用户,根据用户id查询信息
@Select("select * from user where id = #{id}")
User selectById(int id);

//查询用户及用户下所有订单
@Select("select * from user")
@Results(
        {
                @Result(column = "id", property = "id"),
                @Result(column = "username", property = "username"),
                @Result(column = "password", property = "password"),
                @Result(column = "birth", property = "birth"),
                @Result(column = "address", property = "address"),
                @Result(column = "id", property = "orders", javaType = List.class,
                        //id会作为cn.itsp.demo.mapper.OrderMapper下selectByUid方法的参数【uid】,返回一个List<Order>
                        many = @Many(select = "cn.itsp.demo.mapper.OrderMapper.selectByUid")
                )
        }
)
List<User> selectAllUserAndOrders();

}

OrderMapper

package cn.itsp.demo.mapper;

import cn.itsp.demo.entity.Order;
import cn.itsp.demo.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface OrderMapper {

@Select("select * from order_t where uid = #{id}")
List<Order> selectByUid(int uid);

//查询所有订单,同时查询订单用户
@Select("select * from order_t")
@Results({
        @Result(column = "id", property = "id"),
        @Result(column = "order_time", property = "order_time"),
        @Result(column = "total", property = "total"),
        @Result(column = "uid", property = "user", javaType = User.class,
                //uid会作为cn.itsp.demo.mapper.UserMapper下selectById方法的参数,返回一个User
                one = @One(select = "cn.itsp.demo.mapper.UserMapper.selectById")
        )
})
List<Order> selectAllOrderAndUser();
}

UserController添加url映射并调用相关方法

在这里插入图片描述

测试

在这里插入图片描述

在这里插入图片描述

接下来实现查询订单的时候把其用户一起查出来

在订单实体类中加入要它表查询的user属性

在这里插入图片描述

用uid作为UserMapper中selectById方法的参数,拿到uid对应user

在这里插入图片描述

OrderController添加映射并调用orderMapper中对应方法

在这里插入图片描述

测试

在这里插入图片描述
另外,因为UserMapper继承了BaseMapper,其中是有selectById方法的
所以可以不写,效果相同
在这里插入图片描述
在这里插入图片描述

附上个人对@Results的解读

在这里插入图片描述
正因为返回值类型是一个装Order对象的List,而我们的Order类中是有uid这个属性的,这里并没有对uid属性给值,故方法返回值中uid=null

小优化

在这里插入图片描述
在这里插入图片描述
uid为null的问题解决了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上进行了扩展和功能增强,其中包括了多表查询的支持。下面介绍一些常见的多表查询方法。 1. 基于注解的多表查询 MyBatis-Plus 支持使用注解的方式进行多表查询,具体的实现方法可以参考 MyBatis-Plus 的文档。例如,可以使用 @Sql 注解,配合 SQL 语句进行多表查询。示例代码如下: ```java @Sql("select u.*, o.* from user u left join order o on u.id = o.user_id where u.id = #{userId}") UserOrderVo getUserOrder(@Param("userId") Long userId); ``` 2. 基于 XML 配置的多表查询 MyBatis-Plus 还支持通过 XML 配置文件进行多表查询。在 XML 配置文件中,可以使用 <select> 标签进行多表查询的定义。例如,可以使用 <include> 标签引入其他 SQL 片段,从而组合成复杂的多表查询。示例代码如下: ```xml <select id="getUserOrder" resultType="com.example.vo.UserOrderVo"> select u.*, o.* from user u left join order o on u.id = o.user_id where u.id = #{userId} </select> ``` 3. 使用 MyBatis-Plus 提供的方法进行多表查询 MyBatis-Plus 还提供了一些方法来简化多表查询的操作,例如 selectJoinPage()、leftJoin()、rightJoin() 等。这些方法可以直接在 Service 类中调用,从而避免手写 SQL 语句。 例如,可以使用 selectJoinPage() 方法进行多表查询并分页: ```java IPage<UserOrderVo> page = userMapper.selectJoinPage(new Page<>(pageNum, pageSize), userId); ``` 其中,selectJoinPage() 方法的第一个参数是一个分页对象,第二个参数是查询条件。返回结果为一个 IPage 对象,其中包含了查询结果的分页信息和数据。 以上是一些 MyBatis-Plus 多表查询的常用方法,根据具体的业务需求选择合适的方法即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值