springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

news2024/11/27 19:49:55

mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。
本篇文章的内容是有两张表,分别是用户表和订单表,在不直接在数据库做表连接的情况下,通过后台代码完成①查询订单的同时查到该订单所属的用户,②查询用户的同时查到该用户的订单列表的功能。

Mybatis版本

准备表环境

t_user

在这里插入图片描述

在这里插入图片描述


### t_order

在这里插入图片描述


在这里插入图片描述

编写实体类

Order类

@TableName("t_order")
public class Order {
    @TableId(type = IdType.AUTO)
    private int id;
    private String order_time;
    private String total;
    private int uid;
    @TableField(exist = false)
    private User user;
  • @TableName表示数据库表名的映射。其实加上与不加都无所谓。因为我们先用的是mybatis,最终会自己写一个方法去映射。
  • @TableId(type = IdType.AUTO)表示该注解下面的字段在数据库是自增的。
  • @TabelField(exist = false)表示该注解下面的字段在数据库中实际是不存在的,mybatis不需要去数据库中映射,我们自己会编写映射方法。

最后记得在类里面自动生成getter和setter还有toString方法。

User类

@TableName("t_user")
public class User {
   @TableId(type = IdType.AUTO)
   private int id;
   private String username;
   private String password;
   private String birthday;
   //描述用户的所有订单
   @TableField(exist = false)
   private List<Order>  orders;

@TableName同上,加与不加都无所谓。最后记得在类里面自动生成getter和setter还有toString方法。

编写mapper方法

UserMapper

@Mapper
public interface UserMapper extends BaseMapper<User> {

    @Update("insert into t_user values (#{id},#{username},#{password},#{birthday})")
    public int insert(User user);

    //查询用户及其所有的订单
    @Select("select * from t_user")
    @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.mybatisplusdemo.mapper.OrderMapper.selectByUid")
                    )
            }
    )
    List<User> selectAllUserAndOrders();
}
  • @Result的column代表数据库里的列名,property代表代码里的数据结构。即从数据库里查到的数据映射到代码里的哪个参数。
  • 因为一个用户可能有多个订单,所以最后一个@Result里面写的是的many=@Many。
  • 最后一个@Result表明的意思是mybatis/mybatisplus允许在mapper方法内部继续调用一个mapper方法,把column里查到的数值传给mapper方法,最终后者返回的结果才是真正传给property的值。
  • 注意调用的mapper方法需要写全类名(上篇文章提到过如何快速复制)再加方法名。

OrderMapper

@Select("select * from t_order where uid = #{uid}")
List<Order> selectByUid(int uid);
    
 @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.mybatisplusdemo.mapper.UserMapper.selectById")
                    )
            }
    )
    List<Order> selectAllOrderAndUser();

注意到是one = @One,因为一个订单只对应着一个用户。

编写controller方法

OrderController

@RestController
@CrossOrigin
public class OrderController {
    @Autowired
    private OrderMapper orderMapper;

    @GetMapping("/order/findAll")
    public List findAll()
    {
        List orders = orderMapper.selectAllOrderAndUser();
        return  orders;
    }
}

UserController

@RestController
@CrossOrigin
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user")
    public List query(){
        List<User> list = userMapper.selectList(null);
        System.out.println(list);
        return list;
    }

    @GetMapping("/user/findAll")
    public List<User> find(){ return userMapper.selectAllUserAndOrders();}
}

测试

在这里插入图片描述

在这里插入图片描述

MybatisPlus版本做条件查询

mybatisplus提供了封装好的QueryWrapper类,让我们做条件查询或者更新查询。
注意如果想要使用mybatisplus,要把原来实体类里的@TableField加上

编写controller类

UserMapper

@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user/find")
    public List<User> query() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username","zhangsan");
        // 筛选出用户名为张三的用户。
        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里面添加方法

在UserController中添加分页查询方法

@GetMapping("user/findByPage")
    public IPage findByPage(){
        Page<User> page = new Page<>(0,2); // 设置起始值和每页条数
        IPage iPage = userMapper.selectPage(page,null); // 返回结果集,这里如果想额外增加附属条件
        //可以写在第二个参数queryWrapper中
        return iPage;
    }

测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何搭建团队知识库?试试新的工具和方法吧!

知识本身没有价值&#xff0c;只有被利用的知识才能发挥作用。我们经常见到有许多“宏伟”的团队知识库&#xff0c;但是从来没有人去用…… 搭建团队知识库 没有人用的团队知识库存在的问题是“我们知道所有问题的答案&#xff0c;就是不知道问题是什么”。如何建立团队知识库…

Rust冒泡排序

Rust冒泡排序 这段代码定义了一个名为 bubble_sort 的函数&#xff0c;接受一个可变的整数类型数组作为输入&#xff0c;然后使用嵌套的循环来实现冒泡排序。外部循环从数组的第一个元素开始迭代到倒数第二个元素&#xff0c;内部循环从数组的第一个元素开始迭代到倒数第二个元…

mysql面试题7:MySQL事务原理是什么?MySQL事务的隔离级别有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL事务原理是什么? MySQL事务的原理是基于ACID(原子性、一致性、隔离性、持久性)特性来实现的,具体原理如下: Atomicity(原子性):事务…

深入理解操作系统- - 进程篇(1)

目录 进程解释&#xff1a; process in memory(进程在内存中包含什么) : 并发的进程&#xff1a; 进程定义&#xff1a; 个人定义&#xff1a; 书本定义&#xff1a; 进程状态&#xff1a; 进程何时离开CPU&#xff1a; 内部事件&#xff1a; 外部事件&#xff1a; 进…

Backblaze发布2023中期SSD故障数据质量报告

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 本文我们主要看下Backblaze最新发布的2023中期SSD相关故障稳定性数据报告。…

华为ensp单臂路由及OSPF实验

单臂路由及OSPF实验 1.1实验背景 在这个实验中&#xff0c;我们模拟了一个复杂的网络环境&#xff0c;该网络环境包括多个子网和交换机。这个实验旨在帮助网络工程师和管理员了解如何配置单臂路由和使用开放最短路径优先&#xff08;OSPF&#xff09;协议来实现不同子网之间的…

【网络安全】网络安全之信息收集和信息收集工具讲解,告诉你黑客是如何信息收集的

一&#xff0c;域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集&#xff0c;比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具&#xff0c;汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

数据集笔记:OpenCelliD(手机基站开放数据库)

下载数据的方式可见&#xff1a;【数据获取】全球最大手机基站开源数据库 1 读取数据 import pandas as pdpd.read_csv(C:/Users/16000/Downloads/454.csv/454.csv,headerNone,names[Radio,MCC,MNC,LAC/TAC/NID,CID,Longitude,Latitude,Range,Samples,Changeable1,Changeable…

前端开发和后端开发的一些建议

前端开发和后端开发是Web开发的两个方向 前端开发主要负责实现用户在浏览器上看到的界面和交互体验&#xff0c;包括HTML、CSS和JavaScript等技术。后端开发主要负责处理服务器端的逻辑和数据&#xff0c;包括数据库操作、服务器配置和接口开发等技术。 前端开发 前端开发需…

卫星图像应用 - 洪水检测 使用DALI进行数据预处理

这篇文章是上一篇的延申。 运行环境&#xff1a;Google Colab 1. 当今的深度学习应用包含由许多串行运算组成的、复杂的多阶段数据处理流水线&#xff0c;仅依靠 CPU 处理这些流水线已成为限制性能和可扩展性的瓶颈。 2. DALI 是一个用于加载和预处理数据的库&#xff0c;可…

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础&#xff0c;具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力&#xff0c;培养学生解决实际问题的工程实践能力&#xff0c;激发学生创新意识&…

leetCode 188.买卖股票的最佳时机 IV 动态规划 + 状态压缩

给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说&#xff0c;你最多可以买 k 次&#xff0c;卖 k 次。 注意&#xff1a;你不能同时参与多…

国庆中秋特辑(五)MySQL如何性能调优?下篇

目录 5.数据库维护6. 数据库调优工具7.数据库架构优化8.代码层面优化9. 硬件层面优化10. 数据库安全 MySQL 性能优化是一项关键的任务&#xff0c;可以提高数据库的运行速度和效率。以下是一些优化方法&#xff0c;包括具体代码和详细优化方案。 接下来详细介绍&#xff0c;共有…

Hudi第二章:集成Spark

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…

C/C++字符函数和字符串函数详解————长度受限制的字符串函数

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.长度受限制的字符…

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…

什么是 MyBatis?与 Hibernate 的区别

引言 在现代的应用程序开发中&#xff0c;与数据库的交互是至关重要的。为了简化数据库访问&#xff0c;许多开发者选择使用ORM&#xff08;对象-关系映射&#xff09;框架。MyBatis和Hibernate都是流行的ORM框架&#xff0c;它们可以帮助开发者更轻松地将Java对象映射到数据库…

Springboot+vue的球队训练信息管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的球队训练信息管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的球队训练信息管理系统&#xff0c;采用M&…

选择排序、冒泡排序、快速排序、归并排序

1、选择排序 设一个数据集有n个元素&#xff0c;选择这n个元素中最小的一个与第一个元素交换位置&#xff0c;再在剩下的n-1个元素中选择最小的一个与第二个元素交换位置&#xff0c;直到在最后两个元素中选择最小的一个放在倒数第二的位置上&#xff0c;简单选择排序是不稳定…