SpringBoot+MyBatis多表查询:以点餐系统的订单管理为例

news2024/11/19 1:44:55

文章目录

  • 项目场景
  • 数据库设计
  • POJO
  • Dao
  • Service
  • Test
  • 运行结果
  • 问题及解决

项目场景

SpringBoot + MyBatis ,实现点餐系统的订单查询。
参考:SpringBoot+MyBatis多表联合查询


数据库设计

通常一个订单中会包含多个菜品,即一条 order 里含多个 item,而且 item 的外键是订单编号 orderid ,连接到订单表 orders。

订单表 orders
数据库设计
先写一点数据用作测试:
数据库设计
订单菜品表 items:
数据库设计
同样先随便写点数据:
数据库设计


POJO

我个人认为 pojo 中变量的名字最好是和数据库中表里的字段名保持一致,这样之后写映射方便一些,不容易出错。

package com.example.spring.pojo;

import java.util.List;

public class Order {
	// 订单ID、桌号
    private int orderid,tableid;
    //	顾客ID、消费时间、订单状态
    private String consumerid,time,status;
    //	已点菜品列表
    private List<Item> itemList;

    public int getOrderid() {
        return orderid;
    }

    public void setOrderid(int orderid) {
        this.orderid = orderid;
    }

    public int getTableid() {
        return tableid;
    }

    public void setTableid(int tableid) {
        this.tableid = tableid;
    }

    public String getConsumerid() {
        return consumerid;
    }

    public void setConsumerid(String consumerid) {
        this.consumerid = consumerid;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<Item> getItemList() {
        return itemList;
    }

    public void setItemList(List<Item> itemList) {
        this.itemList = itemList;
    }
}
package com.example.spring.pojo;

public class Item {

	//	订单列表
    private int orderid;
    //	菜名、菜品份量、图片
    private String name,size,img;
    //	单价、数量
    private int price,num;

    public int getOrderid() {
        return orderid;
    }

    public void setOrderid(int orderid) {
        this.orderid = orderid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

Dao

package com.example.spring.dao;

import com.example.spring.pojo.Order;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderDao {
    
    /**
     * 一对多联合查询
     * */
    Order findByOrderid(int orderid);

}

多表查询的映射需要自定义一下结果对象 resultMap:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.spring.dao.OrderDao">
    <resultMap id="oni" type="com.example.spring.pojo.Order">
        <!--重点1:这里的column对应的值为sql语句中对应字段的别名-->
        <id column="orderid" property="orderid" javaType="int"></id>
        <result column="tableid" property="tableid" javaType="int"></result>
        <result column="consumerid" property="consumerid" javaType="String"></result>
        <result column="time" property="time" javaType="String"></result>
        <result column="status" property="status" javaType="String"></result>
        <!--重点2:这里一定要用ofType不能用javaType了,因为对应的Item是一个List,如果用javaType的话就会报错数据类型不匹配-->
        <collection property="itemList" ofType="com.example.spring.pojo.Item" >
            <id column="orderid" property="orderid" javaType="int"></id>
            <id column="name" property="name" javaType="String"></id>
            <result column="size" property="size" javaType="String"></result>
            <result column="img" property="img" javaType="String"></result>
            <result column="price" property="price" javaType="int"></result>
            <result column="num" property="num" javaType="int"></result>
        </collection>
    </resultMap>
    <select id="findByOrderid" resultMap="oni" parameterType="int">
        <!--重点3:我们查询出了一条记录所有的值,但是两个表有很多字段都是重名的怎么办,那就需要为同名字段起一个别名,别忘了修改resultMap对应字段的column值哦-->
        select a.orderid,a.tableid,a.consumerid,a.time,a.status,b.orderid,b.name,b.size,b.img,b.price,b.num from orders a,items b where a.orderid=b.orderid and a.orderid=#{orderid}
    </select>
</mapper>

Service

package com.example.spring.service;

import com.example.spring.pojo.Order;

import java.util.List;

public interface OrderService {

    /**
     * 根据订单编号查询订单
     * */
    public Order findByOrderid(int orderid);
    
}
package com.example.spring.service.impl;

import com.example.spring.pojo.Order;
import com.example.spring.dao.OrderDao;
import com.example.spring.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderDao orderDao;

    /**
     * 一对多联合查询
     * */
    public Order findByOrderid(int orderid){
        return orderDao.findByOrderid(orderid);
    }
}

Test

做个单元测试看看能不能正确访问数据并取出:

package com.example.spring.service.impl;

import com.example.spring.pojo.Item;
import com.example.spring.pojo.Order;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;

import java.util.List;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
class OrderServiceImplTest extends AbstractTestNGSpringContextTests {
    @Autowired
    OrderServiceImpl orderService;

    @Test
    public void findByOrderid() {
        Order order = orderService.findByOrderid(10001);
        System.out.println("订单编号:" + order.getOrderid());
        System.out.println("桌号:" + order.getTableid());
        System.out.println("时间:" + order.getTime());
        List<Item> itemList = order.getItemList();
        for(int i=0;i<itemList.size();i++){
            System.out.println(itemList.get(i).getName() + "\t" + itemList.get(i).getSize() + "\t" + itemList.get(i).getNum() + "\t" + itemList.get(i).getPrice());
        }
    }
}

运行结果

运行结果


问题及解决

  • Cannot resolve symbol “RunWith”.
    添加依赖。
		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher-->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.1.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

参考:springboot 单元测试service遇到的坑(cannot resolve symbol “RunWith” )

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

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

相关文章

使用 Zotero Citation Counts Manager 自动获取文献引用数

前言 最近习惯了搜完文献把文献的引用贴进 Zotero 文献条目的 Note 里&#xff0c;但是自己一点一点打字太累。想到了 Zotero 有插件&#xff0c;简单调研一下&#xff0c;发现了一个可以用的插件。支持 CrossRef 和 SemanticScholar 的引用数获取。&#xff08;相对来说个人比…

QT QSlider、QHorizontalSlider、QVerticalSlider 控件 使用详解

本文详细的介绍了QSlider、QHorizontalSlider、QVerticalSlider控件的各种操作&#xff0c;例如&#xff1a;新建界面、设置刻度显示、设置范围值、设置值、获取值、设置步长、刻度间隔、改变方向、滑动信号、按下信号、滑动信号、释放滑块、样式表等操作。 本系列QT全面详解文…

职业生涯交叉点,7年测试工程师经历,继续做测试还是转开发?

我毕业后一直从事软件测试工作&#xff0c;今年28岁了。所做的工作都是功能测试&#xff0c;对于性能测试、自动化测试完全没有接触。 我是在深圳的一个小公司上班&#xff0c;每天朝九晚五的&#xff0c;工作不累。属于那种要来活了半天就可以搞定&#xff0c;剩下的时间都是…

三车道交通流元胞自动机研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

app提交上架最新流程 ios​

一、上架基本需求资料 1、苹果开发者账号&#xff08;公司已有可以不用申请&#xff0c;需要开通开发者功能&#xff0c;每年 99 美元&#xff09;​ 2、开发好的APP​ 二、证书 上架版本需要使用正式的证书​ 1、创建证书 ​​Apple Developer​​​ 2、上传证书 Sign In …

设计模式之工厂方法模式

factory method design pattern 工厂方法模式的概念、工厂方法模式的结构、工厂方法模式的优缺点、工厂方法模式的使用场景、工厂方法模式的实现示例、工厂方法模式的源码分析 1、工厂方法的概念 工厂方法模式&#xff0c;及简单工厂模式的升级版&#xff0c;其抽象了对象的创…

进阶 - Git分支管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGglo72S-1670494545297)(https://lili40342.gitee.io/my-images/page/p_git.png)] 本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目…

用无代码,「低」人力成本也能做出「高」质量售后服务

目录 智能派单提升响应速度,移动端处理高效便捷 主动提升客户满意度,统一管理客户信息 标准化领、退料流程,精细化控制物料成本 沉淀数据资产,实时掌握最新状况 双十一大促热潮刚过,部分商家就开始因为“重销售,轻售后”的经营策略,而面临消费者的维权投诉,导致庆功…

企业微信对外收款功能如何开通?

之前很多企业在微信上运营客户&#xff0c;与客户达成交易后在微信上完成收款&#xff0c;但是会存在员工谎报账款、走私单的情况&#xff0c;因此企业改用企业微信对公收款。 前言 之前很多企业都在微信上运营客户&#xff0c;从开始追踪客户到成交客户这一整个过程都在微信上…

Day41——Dp专题

文章目录四、完全背包01背包的核心代码完全背包的核心代码12、零钱兑换 II13、组合总和 Ⅳ四、完全背包 完全背包&#xff1a;每一个物品可以选无限次 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件 01背包的核心代码 for(int i 0; i < weight.…

全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决

文章目录全网最全的linux上docker安装oracle的详细文档&#xff0c;遇到了n个问题&#xff0c;查了几十篇文章&#xff0c;最终汇总版&#xff0c;再有解决不了的,私聊我&#xff0c;我帮你解决1. 拉取阿里镜像oracle2. 创建初始化数据3. 创建启动容器 数据持久化4. 进入oracle…

JVM学习初整理

JVM 内存结构(运行时数据区)&#xff1a;堆(Heap)&#xff0c;方法区(Method area)&#xff0c;栈(本地方法栈(Native Method Stacks)&#xff0c;虚拟机方法栈(Java Virtual Machine Stacks))&#xff0c;程序计数器(The pc Register) 堆&#xff1a;java虚拟机所管理的内存…

空调集中控制器的分类

在日常生活中&#xff0c;人们接触较多的是空调遥控器&#xff0c;空调智能控制器与空调遥控器有较大区别。空调遥控器是一对一管理&#xff0c;空调控制器可以集中管理。一般应用于机房管理、学校教室、图书馆管理、办公室、大型商场、工厂宿舍等地方。 红外空调控制器 红外空…

ACM6753(18V/3A三相无感BLCD无刷直流电机驱动IC)

概述 ACM6753是一款18V/3A三相无感BLCD(无刷直流)电机驱动IC、180˚正弦&#xff0c;集成驱动算法预驱MOS &#xff0c;内置电流检测。 产品指标和特性 • 供电电压范围&#xff1a;5V-24V • 上侧MOS下侧MOS&#xff1a;250mΩ • 3A 连续旋转电流&#xff0c;4A峰值保护电流 …

图书商城在线销售系统(ssm,layui,mysql)+全套视频教程

今天&#xff0c;我们发布一套【图书商城在线销售系统(ssm,layui,mysql)】,系统使用技术包含JAVA,SSM,LAYUI,MYSQL&#xff0c;这套系统后台框架使用SSM,数据库使用MySql, 这套系统包含完整的源代码和数据库脚本&#xff0c;根据我们提供的开发工具和运行视频教程&#xff0c;拿…

Java进阶——IO流(II)

文章目录三、节点流和处理流3.1、处理流BufferedReader和BufferedWriter3.2、处理流BufferedInputStream和BufferedOutputStream3.3、对象流ObjectInputStream和ObjectOutputStream3.4、标准输入输出流3.5、转换流InputStreamReader和OutputStreamWriter3.6、打印流**PrintStre…

【多目标进化优化】MOPSO 原理与代码实现

&#x1f388;&#x1f49e;&#x1f49e; &#x1f607; 热烈欢迎您的到来 &#x1f607; &#x1f498;&#x1f498;&#x1f388;——青年有志 &#x1f3c6;初衷&#xff1a; 通俗的语言 dapei 核心的内容 &#x1f389; 博主相信&#xff1a; 有足够的积累&#xff0c…

一个简单的WEB网页制作作业——黑色的山河旅行社网站(5个页面)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

2022年各国程序员编程水平排行榜出炉,排名第一的国家没听说过

哪个地方的程序员编程水平最高&#xff1f;相信很多人对这个问题感兴趣&#xff0c;今天就来聊一聊这个话题。 Pentalog 是一个全球数字服务平台&#xff0c;主要帮助企业寻找世界上一流的IT人才&#xff0c;每年都会发布一份全球IT行业报告&#xff0c;今天文章的数据也是来自…

单片机控制马达驱动IC的应用

8位机最常见的应用单片机驱动马达IC工作&#xff0c;马达可支持无级调速&#xff08;PWM&#xff09;&#xff0c;正转&#xff0c;反转&#xff0c;刹车。该应用简单高效适应于各种应用&#xff0c;节约成本的不二选择。 今天就跟大家分享曾经做过的马达驱动IC的应用。 主电…