Springboot+Mybatis-plus不使用SQL语句进行多表添加操作及问题小结
作者:晚安@(—-—)@ 发布时间:2021-09-30 10:31:10
在Springboot+Mybatis-plus不使用SQL语句进行多表添加操作
我所遇到的问题准备工作在测试环境下模拟思维分解一下:创建出一个带有参数的BrandDTO对象模拟对后台传递参数
我所遇到的问题
我们都知道,在我们使用Mybatis-plus中进行多表操作是极其困难的,如果你不使用Mybatis-plus-join这一类的工具,你只能去配置对应的Mapper.xml文件,配置又臭又长的ResultMap,然后再去写对应的sql语句,这种方法虽然看上去很麻烦,但具有很高的灵活性,可以让我们更灵活的修改甲方需要的功能.
但是如果我将要做一个很普通的小项目,不需要什么灵活的变动,并且我不想去写SQL语句,想直接用Mybatis-plus的功能来实现多表(一主多副)数据的添加,那我该怎么做呢?
观看数据库可以知道,我们有商品表,然而商品对于商品图片,商品参数和商品类型都是一对多或者多对一的关系,但是我想要我们的前端可以直接提交一个表单就能完成多个表中数据的添加,多表操作是必然的了
准备工作
因为此操作之前我已经使用了mybatis-plus-join的多表查询操作,所以我已经生成了一个DTO的实体类
@Data
public class BrandDTO {
private Integer id;
//类型表
private String type;
//商品表
private String brandName;
private String companyName;
private String description;
//图片链接表
private List<Img> imgUrlList;
//参数表
private List<Parameter> parameterList;
}
在这个类中你会疑惑 : 为什么我不直接封装一个Brand实体对象进来呢?
因为我之前使用了这个类来进行连表查询,把各个实体类的参数分开放进来(竟然没有重名的 hhhh),并且这个类需要做展示,所以我把Brand类的属性原原本本加入进来,而tpye对应Brand应该是多(type)对一(Brand),所以在这里我也只封装了一个,但由于Brand对于Img和Parameter是一对多的关系,所以我把他们封装成为了一个list<对象>,就这样我们得到了一个类似于中间类的东西
在测试环境下模拟
我们不妨想一下,有了这样的一个类,我们只需要把参数分开添加到各个表中,我们需要想象我们得到一个封装有数据的BrandDTO的对象,然后拆解开来使用各自的mapper接口的方法来进行插入表格行为
(首先接口要继承对应的BaseMapper<>,才可以进行快速操作,当然如果你在接口有对应的添加方法也可以,但是既然我们用了mybatis-plus,为什么还要拐回去自己写添加方法?)
于是,经过几次反复实验,我得到了如下测试方法:
@Test
public void addBrand(){
Brand brand = new Brand();
Type type = new Type();
Img img = new Img();
Parameter parameter = new Parameter();
BrandDTO brandDTO = new BrandDTO();
brandDTO.setBrandName("测试商品3");
brandDTO.setCompanyName("厂家3");
brandDTO.setDescription("这是第二个个测试");
brandDTO.setType("第Ⅱ型");
List<Img> imgs =new ArrayList<>();
imgs.add(new Img("w/daw/daw/daww"));
imgs.add(new Img("xxwdAWd/dawd/wx"));
brandDTO.setImgUrlList(imgs);
List<Parameter> parameters = new ArrayList<>();
parameters.add(new Parameter("110","270*860*270",30,450));
parameters.add(new Parameter("120","170*4350*720",990,5530));
brandDTO.setParameterList(parameters);
List<Img> imgUrlList = brandDTO.getImgUrlList();
List<Parameter> parameterList = brandDTO.getParameterList();
brand.setBrandName(brandDTO.getBrandName());
brand.setCompanyName(brandDTO.getCompanyName());
brand.setDescription(brandDTO.getDescription());
brandMapper.insert(brand);
Integer id = brand.getId();
type.setBType(brandDTO.getType());
type.setBId(id);
typeMapper.insert(type);
for (Parameter parameterl : parameterList) {
parameter.setBModel(parameterl.getBModel());
parameter.setBOutput(parameterl.getBOutput());
parameter.setBSize(parameterl.getBSize());
parameter.setBId(id);
parameterMapper.insert(parameter);
}
for (Img imgl : imgUrlList) {
img.setImgUrl(imgl.getImgUrl());
img.setBrandId(id);
imgMapper.insert(img);
}
System.out.println(id);
}
思维分解一下:
接下来我会对方法体的各个部分进行分解表达
创建出一个带有参数的BrandDTO对象
首先我们模拟了一个封装有各个参数的BrandDTO对象:
Type type = new Type();
Img img = new Img();
Parameter parameter = new Parameter();
BrandDTO brandDTO = new BrandDTO();
brandDTO.setBrandName("测试商品3");
brandDTO.setCompanyName("厂家3");
brandDTO.setDescription("这是第二个个测试");
brandDTO.setType("第Ⅱ型");
List<Img> imgs =new ArrayList<>();
//此操作能成功是因为我在对应的对象中生成了除了id属性和外键属性的有参构造
imgs.add(new Img("w/daw/daw/daww"));
imgs.add(new Img("xxwdAWd/dawd/wx"));
brandDTO.setImgUrlList(imgs);
List<Parameter> parameters = new ArrayList<>();
//此操作能成功是因为我在对应的对象中生成了除了id属性和外键属性的有参构造
parameters.add(new Parameter("110","270*860*270",30,450));
parameters.add(new Parameter("120","170*4350*720",990,5530));
brandDTO.setParameterList(parameters);
这一部分主要是对参数的封装,是前端的工作,让我们后台服务器收到一个带有参数的BrandDTO对象
模拟对后台传递参数
取出各个表中所对应的各个参数
//取出ImgUrlList和ParameterList()
List<Img> imgUrlList = brandDTO.getImgUrlList();
List<Parameter> parameterList = brandDTO.getParameterList();
//单独封 * rand对象
brand.setBrandName(brandDTO.getBrandName());
brand.setCompanyName(brandDTO.getCompanyName());
brand.setDescription(brandDTO.getDescription());
//调用对应Mapper接口的insert方法(或者你自己写的添加方法)
brandMapper.insert(brand);
//使用主键返回(要确保mybatis中设置了主键自增并且在各个实体类中声明了主键属性)
Integer id = brand.getId();
经过以上以上操作我们向Brand表中添加了一行信息,并且将主键返回了过来.
于是我们的其他表知晓了对应的商品的id,就可以利用此id来进行表中外键id的定义:
(请注意,在这个测试类中我把所需要用的各个实体类的Mapper接口都注入了,所以我才能调用insert方法)
//向Type表中添加数据并指定外键(BrandID)的id
type.setBType(brandDTO.getType());
type.setBId(id);
typeMapper.insert(type);
//向Paramater表中添加数据并指定外键(BrandID)的id
for (Parameter parameterl : parameterList) {
parameter.setBModel(parameterl.getBModel());
parameter.setBOutput(parameterl.getBOutput());
parameter.setBSize(parameterl.getBSize());
parameter.setBId(id);
parameterMapper.insert(parameter);
}
//向Img表中添加数据并指定外键(BrandID)的id
for (Img imgl : imgUrlList) {
img.setImgUrl(imgl.getImgUrl());
img.setBrandId(id);
imgMapper.insert(img);
}
采用循环添加,我们可以将对象中的数据逐个添加到各个表中,接下来我们需要通过控制台来得到我们添加商品对应的主键id:
System.out.println(id);
在这之后我们运行,我这里得到的数据是3,然后我们去调用通过id查询商品的方法:
我这里用的是Apifox:
可以看出来我们的信息已经插入了表格.返回值部分为null是因为我写的多表查询有一些小bug,但是在数据库仍然是有数据的,由此可见,这个测试是成功了,接下来只要将代码CV到对应的service,在controller层模拟传入一个Json对象就可以检验是否可行!
来源:https://blog.csdn.net/qq_53178983/article/details/130307155


猜你喜欢
- Kotlin中SharedFlow的使用 VS StateFlowSharedFlow 是继承于 Flow ,同时它是 StateFlow
- 本文实例为大家分享了C#线程中弹窗的制作代码,供大家参考,具体内容如下首先建立一个ShowFrom窗体,窗体中放入两个按钮分别为确定和取消分
- spring boot 使用POI读取Excel文件Excel文件目录Excel模板文件存了resourse目录下,如下图:<depe
- 格式化一个数值,比如123456789.123,希望显示成"$123,456,789.123".要完成需求,可以用jav
- Synchronized实现可见性原理可见性要实现共享变量的可见性,必须保证两点:线程修改后的共享变量值能够及时从工作内存刷新到主内存中其他
- java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧!JavaScript 是一种嵌入式脚本文件,直接
- 本文实例为大家分享了android拖拽框,裁剪出图片的具体代码,供大家参考,具体内容如下import android.graphics.Bi
- 本文实例讲述了Android开发中MotionEvent坐标获取方法。分享给大家供大家参考,具体如下:Android MotionEvent
- 本文实例展示的是一个自定义的定时器组件,有别于.NET Framework里面提供的几个Timer。首先说说该组件开发背景,发现现在手头上的
- 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常
- 在任何的生产环境中我们都不可逃避并发这个问题,多线程作为并发问题的技术支持让我们不得不去了解。这一块知识就像一个大蛋糕一样等着我们去分享,抱
- 之前使用的那台电脑有点旧了,稍微跑一下程序就报内存不够。本来想考虑入手一台带GPU的新电脑,在商品浏览里的时候,考虑到钱包不够厚实。就选了家
- 初始化sp 内部将数据放到 xml 文件中,加载时首先会将硬盘中文件读取到内存中,这样加快了访问速度这次从源码开始,看看里面具体做了什么//
- 本文实例讲述了java 线程方法join简单用法。分享给大家供大家参考,具体如下:虽然关于讨论线程join方法的博客已经很多了,不过个人感觉
- 本文实例为大家分享了java实现学生成绩档案管理系统的具体代码,供大家参考,具体内容如下实验要求• 学生信息录入,信息包括学号、姓名、专业、
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- java 中ArrayList与LinkedList性能比较今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 Lin
- 限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速
- 引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在
- 昨天有个刚学java的师弟发了个程序给我,说死活编译不过,老是报编码问题,自己试了一下,也出问题了...当我们编辑了一个Java源文件保存时