제가 겪은 준비 작업은 테스트 환경에서 생각을 시뮬레이션하여 세분화되었습니다. 매개 변수가 있는 BrandDTO 개체를 생성하여 매개 변수를 백그라운드로 전달하는 것을 시뮬레이션합니다.
Mybatis-plus에서 다중 테이블 작업을 수행하는 것이 매우 어렵다는 것을 우리 모두 알고 있습니다. Mybatis-plus-join과 같은 도구를 사용하지 않으면 해당 Mapper.xml 파일만 구성할 수 있습니다. , 냄새나고 긴 ResultMap을 구성한 다음 해당 SQL 문을 작성합니다. 이 방법은 번거로워 보이지만 매우 유연하며 Party A의 요구 사항을 더 유연하게 수정할 수 있습니다.
그러나 아주 일반적인 작업을 수행할 경우 유연한 변경이 필요하지 않은 소규모 프로젝트이고, SQL 문을 작성하고 싶지 않으며, Mybatis-plus의 기능을 직접 사용하여 다중 테이블(하나의 마스터, 다중 슬레이브) 데이터를 구현하고 싶습니다. 추가, 어떻게 해야 하나요? ?
데이터베이스를 보면 제품 테이블이 있는 것을 알 수 있지만 제품 사진의 products, 제품 매개변수 및 제품 유형은 모두 일대다 또는 다대일입니다. 관계인데, 여러 테이블에 데이터 추가를 완료하기 위해 우리 프론트 엔드에서 직접 양식을 제출하길 원합니다. 다중 테이블 작업은 불가피합니다
이 작업은 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; }
이 클래스에서는 브랜드 엔터티 개체를 직접 캡슐화하지 않는 이유는 무엇입니까?
이전에 사용했기 때문에 이 클래스는 조인을 수행하는 데 사용됩니다. 테이블 쿼리와 각 엔터티 클래스의 매개변수를 따로 넣어서(동일한 이름의 hhhh가 없음) 이 클래스를 표시해야 하므로 Brand 클래스의 속성을 그대로 추가하고 그에 따른 typye를 추가했습니다. Brand는 다(유형) 대 일(Brand)이어야 하므로 여기서는 하나만 캡슐화했지만 Brand는 Img 및 Parameter와 일대다 관계를 갖기 때문에 목록<객체>로 캡슐화했습니다. 그게 바로 우리입니다. 중급 클래스와 비슷한 것을 얻었습니다
생각해 보는 것이 좋을 것입니다. 이러한 클래스에서는 각 테이블에 개별적으로 매개변수만 추가하면 되고 BrandDTO 패키지를 얻는다고 상상하면 됩니다. 데이터가 있는 개체를 분해한 다음 해당 매퍼 인터페이스의 메서드를 사용하여 테이블에 삽입합니다
(먼저 인터페이스는 해당 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();
위 작업 후 우리는 다음으로 보고합니다. 브랜드 정보 행이 추가되고 기본 키가 반환됩니다.
따라서 다른 테이블은 해당 제품의 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인 것을 알 수 있는데, 거기에 이는 여전히 데이터베이스에 데이터가 있음을 알 수 있습니다. 다음으로 해당 서비스에 대한 코드를 CV하고 컨트롤러 계층에서 Json 개체 전달을 시뮬레이션하면 됩니다.
위 내용은 여러 테이블을 추가하기 위해 SQL 문을 사용하지 않고 Springboot+Mybatis-plus를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!