ホームページ  >  記事  >  Java  >  SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法

WBOY
WBOY転載
2023-06-02 11:07:21935ブラウズ

Springboot Mybatis-plus で複数のテーブルを追加するために SQL ステートメントを使用しないでください

私が遭遇した問題の準備作業は、テスト環境で思考をシミュレートすることによって分解されます。パラメーターを使用して BrandDTO オブジェクト シミュレーションを作成します。バックグラウンドのパラメータ

遭遇した問題

Mybatis-plus で複数テーブルの操作を実行するのが非常に難しいことは誰もが知っています。参加すると、対応するマッパーのみを設定できます。柔軟性により、当事者 A が必要とする機能をより柔軟に変更できます。
しかし、柔軟な変更を必要としないごく普通の小規模なプロジェクトを実行する場合、 SQL ステートメントを書きたくないのですが、Mybatis を直接使用して、複数のテーブル (1 つのマスターと複数のコピー) データを追加する関数を使用したいのですが、どうすればよいですか?

データベースを見ると、次のことができます。製品テーブルがあることはわかっていますが、製品製品画像製品パラメータ、および 製品タイプはすべて 1 対多です。または多対 1 のリレーションシップですが、フロントエンドでフォームを直接送信できるようにしたいです 複数のテーブルでデータの追加を完了できます。複数テーブルの操作は避けられません

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法

#準備作業

この操作 -plus-join 複数テーブル クエリ操作の前に mybatis を使用したため、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クラスの属性をそのまま追加し、Brandに対応するtpyeは多(型)対一(Brand)のはずなのでここでは1つだけカプセル化しましたが、Brandにはone-toがあるのでImg と Parameter との多数の関係をリスト にカプセル化しました。このようにして、中間クラスに似たものが得られました。

テスト環境でシミュレートされた

次のようになります。よく考えてください。このようなクラスでは、パラメーターを分離するだけで済みます。各テーブルに追加するには、データをカプセル化する BrandDTO オブジェクトを取得し、それを逆アセンブルして、それぞれのマッパー インターフェイスのメソッドを使用して、テーブルの動作を挿入します。

(まず、インターフェイスは対応する BaseMapper

それで、いくつかの実験を繰り返した結果、次のテスト メソッドが得られました:

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

		//单独封装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 を定義できます。

(このテスト クラスでは、マッパーを挿入したことに注意してください)使用する必要がある各エンティティ クラスのインターフェイスなので、挿入メソッドを呼び出すことができます)

		//向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);
        }

ループ Add を使用して、オブジェクト内のデータを各テーブルに 1 つずつ追加できます。 、コンソールを使用して、追加した製品に対応する主キー ID を取得する必要があります:

System.out.println(id);

その後、実行した結果、ここで得られたデータは 3 で、製品をクエリするメソッドを呼び出しますby ID:

ここで Apifox を使用しています:

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法

私たちの情報がテーブルに挿入されていることがわかります。戻り値の部分は、マルチ私が作成したテーブル クエリには小さなバグがいくつかありますが、データベースにはまだデータが残っています。このテストが成功したことがわかります。次に、コードを対応するサービスに CV するだけです。コントローラー層は、Json オブジェクトを渡すことをシミュレートできます。実現可能かどうかを確認してください!

以上がSQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。