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

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

码农世界 2024-06-21 后端 102 次浏览 0个评论

文章目录

  • 一、多表查询
  • 二、mybatis-plus条件查询
  • 三、分页查询

    一、多表查询

    可能会用到的注解

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

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

    表结构这样

    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,这个很好理解每个用户需要有多个订单嘛,使用一个列表来接受很合理。

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

    在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 selectAllUserAndOrders();
    
    @Select("select * from t_order where uid=#{uid}")
        List selectByUid(int uid);
    

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

    @GetMapping("/user/findall")
        public List find(){
            return userMapper.selectAllUserAndOrders();
        }
    

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


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

    @GetMapping("/order/findall")
        public List findall(){
            List 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 selectAllOrdersandUser();
    
     @Select("select * from User where id = #{id}")
        User selectById(int id);
    

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

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

    二、mybatis-plus条件查询

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

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

    @GetMapping("/user/find/{username}")
        public List findByCond(@PathVariable String username){
            System.out.println(username);
            System.out.println("*---------*");
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("username",username);
            return userMapper.selectList(queryWrapper);
        }
    

    三、分页查询

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

    首先配置好Config文件

    @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 *。

    @GetMapping("/user/findbypage/{current}/{size}")
        public IPage findByPage(@PathVariable int current,@PathVariable int size){
            Page page = new Page<>(current,size);
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("username","Bob");
            IPage iPage = userMapper.selectPage(page,queryWrapper);
            return iPage;
        }
    

转载请注明来自码农世界,本文标题:《springboot之mybatisPlus多表查询及分页查询》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,102人围观)参与讨论

还没有评论,来说两句吧...

Top