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

文章目录

一、多表查询

可能会用到的注解

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

表结构这样

sql 复制代码
CREATE TABLE User (  
    id INT PRIMARY KEY AUTO_INCREMENT, 
    username VARCHAR(255) NOT NULL,  
    password VARCHAR(255) NOT NULL,  
    birthday VARCHAR(10)
);


INSERT INTO User (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');



CREATE TABLE t_order (  
    id INT PRIMARY KEY AUTO_INCREMENT,  
    order_time VARCHAR(255) NOT NULL,  
    total double NOT NULL,  
    uid INT NOT NULL );

INSERT INTO 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是要我们自己写的。路径不能写错哦。

java 复制代码
@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();
java 复制代码
@Select("select * from t_order where uid=#{uid}")
    List<Order> selectByUid(int uid);

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

java 复制代码
@GetMapping("/user/findall")
    public List<User> find(){
        return userMapper.selectAllUserAndOrders();
    }

反过来说,我如果希望查询所有订单及对应的用户,其实直接在OrderMapper里面编写Results映射即可,只不过一个订单只对应一个用户所以要使用one接收,在将uid传入到UserMapper的selectById,在OrderBean里面增加一个User成员变量存放即可。

java 复制代码
@GetMapping("/order/findall")
    public List<Order> findall(){
        List<Order> orders = orderMapper.selectAllOrdersandUser();
        return orders;
    }
java 复制代码
@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();
java 复制代码
 @Select("select * from User where id = #{id}")
    User selectById(int id);

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

二、mybatis-plus条件查询

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

我要查询username是我输入进来的所有行

java 复制代码
@GetMapping("/user/find/{username}")
    public List<User> findByCond(@PathVariable String username){
        System.out.println(username);
        System.out.println("*---------*");
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.eq("username",username);

        return userMapper.selectList(queryWrapper);
    }

三、分页查询

使用mybatisPlus实现分页查询,很实用的一个东西。

首先配置好Config文件

java 复制代码
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor paginationInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

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

java 复制代码
@GetMapping("/user/findbypage/{current}/{size}")
    public IPage findByPage(@PathVariable int current,@PathVariable int size){
        Page<User> page = new Page<>(current,size);
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.eq("username","Bob");
        IPage iPage = userMapper.selectPage(page,queryWrapper);
        return iPage;
    }
相关推荐
养军博客2 分钟前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
IT_陈寒7 分钟前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev11 分钟前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA18 分钟前
String字符串[面试题]
java·开发语言
量化分析码农44 分钟前
【Python量化多因子实战 05】因子也会轮动:因子动量与因子反转的择时应用
后端
陈随易1 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
金銀銅鐵10 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
陈随易10 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
文丑颜不良啊11 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh12 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端