目次
Springboot Mybatis-plus で複数のテーブルを追加するために SQL ステートメントを使用しないでください
遭遇した問題
ホームページ Java &#&チュートリアル SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法

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

Jun 02, 2023 am 11:07 AM
sql springboot mybatis-plus

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 との多数の関係をリスト< object > にカプセル化しました。このようにして、中間クラスに似たものが得られました。

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

次のようになります。よく考えてください。このようなクラスでは、パラメーターを分離するだけで済みます。各テーブルに追加するには、データをカプセル化する 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 オブジェクトを作成します

最初に、さまざまなパラメーターをカプセル化する 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Apr 17, 2024 pm 02:57 PM

HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

Oracle SQLでの除算演算の使用法 Oracle SQLでの除算演算の使用法 Mar 10, 2024 pm 03:06 PM

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

Oracle と DB2 の SQL 構文の比較と相違点 Oracle と DB2 の SQL 構文の比較と相違点 Mar 11, 2024 pm 12:09 PM

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

MyBatis動的SQLタグのSetタグ機能の詳細説明 MyBatis動的SQLタグのSetタグ機能の詳細説明 Feb 26, 2024 pm 07:48 PM

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

SQL の ID 属性は何を意味しますか? SQL の ID 属性は何を意味しますか? Feb 19, 2024 am 11:24 AM

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

SpringBootとSpringMVCの比較と差異分析 SpringBootとSpringMVCの比較と差異分析 Dec 29, 2023 am 11:02 AM

SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivo​​tal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

SQL の 5120 エラーを解決する方法 SQL の 5120 エラーを解決する方法 Mar 06, 2024 pm 04:33 PM

解決策: 1. ログインしているユーザーがデータベースにアクセスまたは操作するための十分な権限を持っているかどうかを確認し、ユーザーが正しい権限を持っているかどうかを確認します; 2. SQL Server サービスのアカウントに指定されたファイルまたはデータベースにアクセスする権限があるかどうかを確認します。 3. 指定されたデータベース ファイルが他のプロセスによって開かれているかロックされているかどうかを確認し、ファイルを閉じるか解放して、クエリを再実行します。管理者として試してください。Management Studio をなどとして実行します。

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? Dec 17, 2023 am 08:41 AM

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか?データの集計と統計は、データ分析と統計を実行する際の非常に重要な手順です。 MySQL は強力なリレーショナル データベース管理システムとして、データの集約と統計操作を簡単に実行できる豊富な集約機能と統計機能を提供します。この記事では、SQL ステートメントを使用して MySQL でデータの集計と統計を実行する方法を紹介し、具体的なコード例を示します。 1. カウントには COUNT 関数を使用します。COUNT 関数は最も一般的に使用されます。

See all articles