Maison  >  Article  >  Java  >  Comment implémenter Springboot+Mybatis-plus sans utiliser d'instructions SQL pour ajouter plusieurs tables

Comment implémenter Springboot+Mybatis-plus sans utiliser d'instructions SQL pour ajouter plusieurs tables

WBOY
WBOYavant
2023-06-02 11:07:21933parcourir

Dans Springboot+Mybatis-plus, les instructions SQL ne sont pas utilisées pour les opérations d'ajout multi-tables

Le travail de préparation que j'ai rencontré se décompose en simulant la réflexion dans l'environnement de test : Créer un objet BrandDTO avec des paramètres pour simuler le passage de paramètres en arrière-plan

Problèmes que j'ai rencontrés

Nous savons tous qu'il est extrêmement difficile d'effectuer des opérations multi-tables dans Mybatis-plus si vous n'utilisez pas d'outils tels que Mybatis-plus-join, vous ne pouvez configurer que le fichier Mapper.xml correspondant. , configurez le ResultMap long et malodorant, puis écrivez l'instruction SQL correspondante. Bien que cette méthode semble gênante, elle est très flexible et nous permet de modifier les besoins de la partie A de manière plus flexible.
Mais si je veux faire une fonction très ordinaire. petit projet qui ne nécessite aucune modification flexible et je ne souhaite pas écrire d'instructions SQL, je souhaite utiliser directement les fonctions de Mybatis-plus pour implémenter des données multi-tables (un maître, plusieurs esclaves) Ajouter, que dois-je faire

En regardant la base de données, nous pouvons voir que nous avons une table de produits, mais produitspour photos de produits, paramètres de produit et types de produits sont tous un à plusieurs ou plusieurs à un. relation, mais je veux que notre front-end soumette directement un formulaire pour compléter l'ajout de données dans plusieurs tables. Les opérations multi-tables sont inévitables

Comment implémenter Springboot+Mybatis-plus sans utiliser dinstructions SQL pour ajouter plusieurs tables

Travail de préparation

Parce que j'ai déjà utilisé cette opération avant Mybatis-plus-. rejoindre une opération de requête multi-table, j'ai donc généré une classe d'entité 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;

}

Dans cette classe, vous vous demanderez : Pourquoi n'encapsule-je pas directement un objet d'entité Brand ?
Parce que je l'ai utilisé avant Cette classe est utilisée pour effectuer une jointure requêtes de table, et les paramètres de chaque classe d'entité sont mis séparément (il n'y a pas de hhhh avec le même nom), et cette classe doit être affichée, j'ai donc ajouté les attributs de la classe Brand tels quels, et typye correspondant à La marque devrait être plusieurs (type) pour un (marque), donc je n'en ai encapsulé qu'une ici, mais comme la marque a une relation un-à-plusieurs avec Img et Parameter, je les ai encapsulés dans une liste, c'est tout. Nous avons quelque chose de similaire à une classe intermédiaire

Simulé dans l'environnement de test

Autant y penser, avec une telle classe, il suffit d'ajouter des paramètres à chaque table séparément, il faut imaginer que l'on obtient un package d'objets BrandDTO avec des données, puis démontez-les et utilisez les méthodes de leurs interfaces de mappage respectives pour les insérer dans le tableau
(Tout d'abord, l'interface doit hériter du BaseMapper correspondant avant de pouvoir effectuer des opérations rapides. Bien sûr, si vous avez un correspondant interface La méthode d'addition est également possible, mais puisque nous avons utilisé mybatis-plus, pourquoi devrions-nous revenir en arrière et écrire nous-mêmes la méthode d'addition ?)

Donc, après plusieurs expériences répétées, j'ai obtenu la méthode de test suivante :

 @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);

    }

Décomposer la réflexion :

Ensuite, je vais décomposer et exprimer chaque partie du corps de la méthode

Créer un objet BrandDTO avec des paramètres

Nous simulons d'abord un objet BrandDTO qui encapsule divers paramètres :

        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);

Cette partie concerne principalement les paramètres Encapsulation est le travail du front-end, permettant à notre serveur backend de recevoir un objet BrandDTO avec des paramètres

Simuler le passage des paramètres en arrière-plan

Récupérer les paramètres correspondants dans chaque table

		//取出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();

Après les opérations ci-dessus, nous rendons compte à Brand Une ligne d'informations est ajoutée et la clé primaire est renvoyée

Ainsi nos autres tables connaissent l'identifiant du produit correspondant, et nous pouvons utiliser cet identifiant pour définir l'identifiant de la clé étrangère dans la table :

(Veuillez noter que dans Dans cette classe de test, j'ai injecté l'interface Mapper de chaque classe d'entité dont j'ai besoin, je peux donc appeler la méthode 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);
        }

En utilisant l'ajout de boucle, nous pouvons ajouter les données de l'objet à chaque table une par une, et puis ensuite, nous devons utiliser la console pour obtenir l'identifiant de clé primaire correspondant au produit que nous avons ajouté :

System.out.println(id);

Après cela, nous exécutons, les données que j'ai obtenues ici sont 3, puis nous appelons la méthode d'interrogation du produit par identifiant :
Ce que j'utilise ici, c'est Apifox :

Comment implémenter Springboot+Mybatis-plus sans utiliser dinstructions SQL pour ajouter plusieurs tables

On peut voir que nos informations ont été insérées dans la table. La partie valeur de retour est nulle car il y a quelques petits bugs dans la requête multi-table que j'ai écrite, mais. il y a encore des données dans la base de données. On peut voir que ce test est réussi. Ensuite, il vous suffit de CV le code au service correspondant et de simuler le passage d'un objet Json au niveau du contrôleur pour vérifier si c'est faisable !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer