Springboot+Mybatis-plus不使用SQL語(yǔ)句進(jìn)行多表添加操作及問(wèn)題小結(jié)
在Springboot+Mybatis-plus不使用SQL語(yǔ)句進(jìn)行多表添加操作
我所遇到的問(wèn)題準(zhǔn)備工作在測(cè)試環(huán)境下模擬思維分解一下:創(chuàng)建出一個(gè)帶有參數(shù)的BrandDTO對(duì)象模擬對(duì)后臺(tái)傳遞參數(shù)
我所遇到的問(wèn)題
我們都知道,在我們使用Mybatis-plus中進(jìn)行多表操作是極其困難的,如果你不使用Mybatis-plus-join這一類(lèi)的工具,你只能去配置對(duì)應(yīng)的Mapper.xml文件,配置又臭又長(zhǎng)的ResultMap,然后再去寫(xiě)對(duì)應(yīng)的sql語(yǔ)句,這種方法雖然看上去很麻煩,但具有很高的靈活性,可以讓我們更靈活的修改甲方需要的功能.
但是如果我將要做一個(gè)很普通的小項(xiàng)目,不需要什么靈活的變動(dòng),并且我不想去寫(xiě)SQL語(yǔ)句,想直接用Mybatis-plus的功能來(lái)實(shí)現(xiàn)多表(一主多副)數(shù)據(jù)的添加,那我該怎么做呢?
觀看數(shù)據(jù)庫(kù)可以知道,我們有商品表,然而商品對(duì)于商品圖片,商品參數(shù)和商品類(lèi)型都是一對(duì)多或者多對(duì)一的關(guān)系,但是我想要我們的前端可以直接提交一個(gè)表單就能完成多個(gè)表中數(shù)據(jù)的添加,多表操作是必然的了
準(zhǔn)備工作
因?yàn)榇瞬僮髦拔乙呀?jīng)使用了mybatis-plus-join的多表查詢操作,所以我已經(jīng)生成了一個(gè)DTO的實(shí)體類(lèi)
@Data public class BrandDTO { private Integer id; //類(lèi)型表 private String type; //商品表 private String brandName; private String companyName; private String description; //圖片鏈接表 private List<Img> imgUrlList; //參數(shù)表 private List<Parameter> parameterList; }
在這個(gè)類(lèi)中你會(huì)疑惑 : 為什么我不直接封裝一個(gè)Brand實(shí)體對(duì)象進(jìn)來(lái)呢?
因?yàn)槲抑笆褂昧诉@個(gè)類(lèi)來(lái)進(jìn)行連表查詢,把各個(gè)實(shí)體類(lèi)的參數(shù)分開(kāi)放進(jìn)來(lái)(竟然沒(méi)有重名的 hhhh),并且這個(gè)類(lèi)需要做展示,所以我把Brand類(lèi)的屬性原原本本加入進(jìn)來(lái),而tpye對(duì)應(yīng)Brand應(yīng)該是多(type)對(duì)一(Brand),所以在這里我也只封裝了一個(gè),但由于Brand對(duì)于Img和Parameter是一對(duì)多的關(guān)系,所以我把他們封裝成為了一個(gè)list<對(duì)象>,就這樣我們得到了一個(gè)類(lèi)似于中間類(lèi)的東西
在測(cè)試環(huán)境下模擬
我們不妨想一下,有了這樣的一個(gè)類(lèi),我們只需要把參數(shù)分開(kāi)添加到各個(gè)表中,我們需要想象我們得到一個(gè)封裝有數(shù)據(jù)的BrandDTO的對(duì)象,然后拆解開(kāi)來(lái)使用各自的mapper接口的方法來(lái)進(jìn)行插入表格行為
(首先接口要繼承對(duì)應(yīng)的BaseMapper<>,才可以進(jìn)行快速操作,當(dāng)然如果你在接口有對(duì)應(yīng)的添加方法也可以,但是既然我們用了mybatis-plus,為什么還要拐回去自己寫(xiě)添加方法?)
于是,經(jīng)過(guò)幾次反復(fù)實(shí)驗(yàn),我得到了如下測(cè)試方法:
@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("測(cè)試商品3"); brandDTO.setCompanyName("廠家3"); brandDTO.setDescription("這是第二個(gè)個(gè)測(cè)試"); 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); }
思維分解一下:
接下來(lái)我會(huì)對(duì)方法體的各個(gè)部分進(jìn)行分解表達(dá)
創(chuàng)建出一個(gè)帶有參數(shù)的BrandDTO對(duì)象
首先我們模擬了一個(gè)封裝有各個(gè)參數(shù)的BrandDTO對(duì)象:
Type type = new Type(); Img img = new Img(); Parameter parameter = new Parameter(); BrandDTO brandDTO = new BrandDTO(); brandDTO.setBrandName("測(cè)試商品3"); brandDTO.setCompanyName("廠家3"); brandDTO.setDescription("這是第二個(gè)個(gè)測(cè)試"); brandDTO.setType("第Ⅱ型"); List<Img> imgs =new ArrayList<>(); //此操作能成功是因?yàn)槲以趯?duì)應(yīng)的對(duì)象中生成了除了id屬性和外鍵屬性的有參構(gòu)造 imgs.add(new Img("w/daw/daw/daww")); imgs.add(new Img("xxwdAWd/dawd/wx")); brandDTO.setImgUrlList(imgs); List<Parameter> parameters = new ArrayList<>(); //此操作能成功是因?yàn)槲以趯?duì)應(yīng)的對(duì)象中生成了除了id屬性和外鍵屬性的有參構(gòu)造 parameters.add(new Parameter("110","270*860*270",30,450)); parameters.add(new Parameter("120","170*4350*720",990,5530)); brandDTO.setParameterList(parameters);
這一部分主要是對(duì)參數(shù)的封裝,是前端的工作,讓我們后臺(tái)服務(wù)器收到一個(gè)帶有參數(shù)的BrandDTO對(duì)象
模擬對(duì)后臺(tái)傳遞參數(shù)
取出各個(gè)表中所對(duì)應(yīng)的各個(gè)參數(shù)
//取出ImgUrlList和ParameterList() List<Img> imgUrlList = brandDTO.getImgUrlList(); List<Parameter> parameterList = brandDTO.getParameterList(); //單獨(dú)封裝brand對(duì)象 brand.setBrandName(brandDTO.getBrandName()); brand.setCompanyName(brandDTO.getCompanyName()); brand.setDescription(brandDTO.getDescription()); //調(diào)用對(duì)應(yīng)Mapper接口的insert方法(或者你自己寫(xiě)的添加方法) brandMapper.insert(brand); //使用主鍵返回(要確保mybatis中設(shè)置了主鍵自增并且在各個(gè)實(shí)體類(lèi)中聲明了主鍵屬性) Integer id = brand.getId();
經(jīng)過(guò)以上以上操作我們向Brand表中添加了一行信息,并且將主鍵返回了過(guò)來(lái).
于是我們的其他表知曉了對(duì)應(yīng)的商品的id,就可以利用此id來(lái)進(jìn)行表中外鍵id的定義:
(請(qǐng)注意,在這個(gè)測(cè)試類(lèi)中我把所需要用的各個(gè)實(shí)體類(lèi)的Mapper接口都注入了,所以我才能調(diào)用insert方法)
//向Type表中添加數(shù)據(jù)并指定外鍵(BrandID)的id type.setBType(brandDTO.getType()); type.setBId(id); typeMapper.insert(type); //向Paramater表中添加數(shù)據(jù)并指定外鍵(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表中添加數(shù)據(jù)并指定外鍵(BrandID)的id for (Img imgl : imgUrlList) { img.setImgUrl(imgl.getImgUrl()); img.setBrandId(id); imgMapper.insert(img); }
采用循環(huán)添加,我們可以將對(duì)象中的數(shù)據(jù)逐個(gè)添加到各個(gè)表中,接下來(lái)我們需要通過(guò)控制臺(tái)來(lái)得到我們添加商品對(duì)應(yīng)的主鍵id:
System.out.println(id);
在這之后我們運(yùn)行,我這里得到的數(shù)據(jù)是3,然后我們?nèi)フ{(diào)用通過(guò)id查詢商品的方法:
我這里用的是Apifox:
可以看出來(lái)我們的信息已經(jīng)插入了表格.返回值部分為null是因?yàn)槲覍?xiě)的多表查詢有一些小bug,但是在數(shù)據(jù)庫(kù)仍然是有數(shù)據(jù)的,由此可見(jiàn),這個(gè)測(cè)試是成功了,接下來(lái)只要將代碼CV到對(duì)應(yīng)的service,在controller層模擬傳入一個(gè)Json對(duì)象就可以檢驗(yàn)是否可行!
到此這篇關(guān)于在Springboot+Mybatis-plus不使用SQL語(yǔ)句進(jìn)行多表添加操作的文章就介紹到這了,更多相關(guān)Springboot Mybatis-plus多表添加內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何在Spring Boot啟動(dòng)后執(zhí)行指定代碼
這篇文章主要介紹了在Spring Boot啟動(dòng)后執(zhí)行指定代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06IDEA 連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
這篇文章主要介紹了IDEA 連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Java多態(tài)性抽象類(lèi)與接口細(xì)致詳解
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08Spring動(dòng)態(tài)注冊(cè)多數(shù)據(jù)源的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring動(dòng)態(tài)注冊(cè)多數(shù)據(jù)源的實(shí)現(xiàn)方法,小編覺(jué)的挺不錯(cuò)的,現(xiàn)分享到腳本之家平臺(tái),需要的朋友可以參考下2018-01-01java連接池Druid獲取連接getConnection示例詳解
這篇文章主要為大家介紹了java連接池Druid獲取連接getConnection示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java四種訪問(wèn)控制修飾符知識(shí)點(diǎn)總結(jié)
本篇文章給大家詳細(xì)分析了Java四種訪問(wèn)控制修飾符的相關(guān)知識(shí)點(diǎn),有興趣的朋友可以參考學(xué)習(xí)下。2018-03-03springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建)
這篇文章主要介紹了springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建),需要的朋友可以參考下2020-08-08