0


springboot之mybatisPlus多表查询及分页查询

文章目录

一、多表查询

可能会用到的注解

在这里插入图片描述

这里的场景是,查询每个用户及其所有的订单。就是查询你的id号的同时,把你所有的历史订单信息都拉出来。

表结构这样

CREATETABLEUser(  
    id INTPRIMARYKEYAUTO_INCREMENT, 
    username VARCHAR(255)NOTNULL,  
    password VARCHAR(255)NOTNULL,  
    birthday VARCHAR(10));INSERTINTOUser(id, username, password, birthday)VALUES(1,'Alice','password123','1990-01-01'),(2,'Bob','pass456word','1992-05-10'),(4,'Bob','pass456word','1992-05-10'),(3,'Bob','pass456word','1992-05-10'),(5,'Bob','pass456word','1992-05-10'),(6,'Bob','pass456word','1992-05-10');CREATETABLE t_order (  
    id INTPRIMARYKEYAUTO_INCREMENT,  
    order_time VARCHAR(255)NOTNULL,  
    total doubleNOTNULL,  
    uid INTNOTNULL);INSERTINTO t_order (order_time, total, uid)VALUES('2023-04-01 00:00:00',100.00,1),('2023-04-01 00:00:00',100.00,1),('2023-04-01 00:00:00',100.00,2),('2023-04-01 00:00:00',100.00,3);

具体的流程呢是在User里面加一个List<Order>,这个很好理解每个用户需要有多个订单嘛,使用一个列表来接受很合理。
在这里插入图片描述
在UserMapper里面写一下方法,很好理解id、username、password、birthday都需要映射到对应类的里的字段

column代表表里面字段,property代表类里面的字段

.。主要是最后的那个many,是要将表里面的

id

通过

selectByUid

的返回结果映射到orders中。这个selectById是要我们自己写的。路径不能写错哦。

@Select("select * from User")//使用Results注解后,所有字段都要手动映射@Results({@Result(column ="id",property ="id"),@Result(column ="username",property ="username"),@Result(column ="password",property ="password"),@Result(column ="birthday",property ="birthday"),@Result(column="id",property ="orders", javaType =List.class,
                            many =@Many(select ="com.example.hello.mapper.OrderMapper.selectByUid"))//使用表里的字段id映射为orders:根据用户的id查找订单。将id传递给selectByUid。})List<User>selectAllUserAndOrders();
@Select("select * from t_order where uid=#{uid}")List<Order>selectByUid(int uid);

然后在controller写调用selectAllUserAndOrders的接口即可。

@GetMapping("/user/findall")publicList<User>find(){return userMapper.selectAllUserAndOrders();}

在这里插入图片描述


反过来说,我如果希望查询所有订单及对应的用户,其实直接在OrderMapper里面编写Results映射即可,只不过一个订单只对应一个用户所以要使用

one

接收,在将uid传入到UserMapper的selectById,在OrderBean里面增加一个User成员变量存放即可。

@GetMapping("/order/findall")publicList<Order>findall(){List<Order> orders = orderMapper.selectAllOrdersandUser();return orders;}
@Select("select * from t_order")@Results({@Result(column ="id",property ="id"),@Result(column ="ordertime",property ="ordertime"),@Result(column ="total",property ="total"),@Result(column ="uid",property ="user",javaType =User.class,
            one =@One(select="com.example.hello.mapper.UserMapper2.selectById"))})List<Order>selectAllOrdersandUser();
@Select("select * from User where id = #{id}")UserselectById(int id);

在这里插入图片描述

注意:如果中间遇到什么问题,尝试一步一步找错误,是不是数据库建立的有问题,注解上面写好的执行语句能不能再sql里面正常执行

二、mybatis-plus条件查询

例如常见的字段等于、大于、小于。mybatis-plus提供了很多模板,我这里举一个例子官网

我要查询

username

是我输入进来的所有行

@GetMapping("/user/find/{username}")publicList<User>findByCond(@PathVariableString username){System.out.println(username);System.out.println("*---------*");QueryWrapper<User> queryWrapper =newQueryWrapper();
        queryWrapper.eq("username",username);return userMapper.selectList(queryWrapper);}

三、分页查询

使用mybatisPlus实现分页查询,很实用的一个东西。
首先配置好Config文件

@ConfigurationpublicclassMybatisPlusConfig{@BeanpublicMybatisPlusInterceptorpaginationInterceptor(){MybatisPlusInterceptor interceptor =newMybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor =newPaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}}

在controller中定义分页查询接口。其中current和size分别代表当前页数和每页是多少条数据。selectPage方法中第一个第二个参数需要通过构造QueryWrapper传入即可,也可以直接传入null表示select *。

@GetMapping("/user/findbypage/{current}/{size}")publicIPagefindByPage(@PathVariableint current,@PathVariableint size){Page<User> page =newPage<>(current,size);QueryWrapper<User> queryWrapper =newQueryWrapper();
        queryWrapper.eq("username","Bob");IPage iPage = userMapper.selectPage(page,queryWrapper);return iPage;}
标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/xdg15294969271/article/details/137359761
版权归原作者 牛右刀薛面 所有, 如有侵权,请联系我们删除。

“springboot之mybatisPlus多表查询及分页查询”的评论:

还没有评论