我所遇到的問題準備工作在測試環境下模擬思維分解一下:創建出一個帶有參數的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物件:
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(); //单独封装brand对象 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物件就可以檢驗是否可行!
以上是Springboot+Mybatis-plus不使用SQL語句進行多表新增怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!