MyBatisの多対多の中間テーブルにデータを挿入します

この従業員管理システムのデモを行う場合、ユーザーとロールは多対多の関係にあり、ユーザーの主キーは自己増加するため、このuser_idを事前に知る方法がないため、挿入するときに最初にユーザーを挿入してから、挿入したIDを見つけて取り出し、中央のテーブルuser_roleに挿入する必要があります。これにより、テーブルの関係を一致させ、完全な挿入プロセスを検討できます。

したがって、問題は、このuser_idを知る方法、それを取り出して、中間テーブルuser_roleに挿入する方法です。

メソッド:挿入要素と更新要素の下の3つの属性がMyBatisで使用されます:
useGeneratedKeys(挿入と更新にのみ役立ちます)これにより、MyBatisはJDBCのgetGeneratedKeysメソッドを使用して、データベースによって内部的に生成された主キーを取得します(MySQLやSQL Serverなどのリレーショナルデータベース管理システムの自動インクリメントフィールド)、デフォルト値:false。
keyProperty(挿入と更新にのみ役立ちます)はプロパティを一意にマークし、MyBatisはgetGeneratedKeysの戻り値またはinsertステートメントのselectKeyサブ要素を介してそのキー値を設定します。デフォルト:未設定。複数の列を生成する必要がある場合は、属性名のコンマ区切りのリストにすることもできます。
keyColumn(挿入と更新にのみ役立ちます)生成されたキー値によってテーブルの列名を設定します。この設定は、一部のデータベース(PostgreSQLなど)でのみ必要です。主キー列が最初の列でない場合に設定する必要があります。テーブル内。複数の列を生成する必要がある場合は、属性名のコンマ区切りのリストにすることもできます。

具体的な実装:
1。userテーブルを挿入します。user_id属性は自己増加するため、挿入しなかったことがわかります。

<insert id="insert" useGeneratedKeys="true" keyProperty="user_id" keyColumn="user_id">
        insert into user
        (user_name,user_gender,user_email,user_phone,user_address,user_birthday,department_id)
        values(#{
   
   user_name},#{
   
   user_gender},#{
   
   user_email},#{
   
   user_phone},#{
   
   user_address},#{
   
   user_birthday},#{
   
   department_id})
    </insert>

2.焦点は中間テーブルuser_roleにあります。ご覧のとおり、userの下のuser_idを直接使用しており、クエリ操作を行っていないため、その特定の値はわかりません。

<insert id="insertUserRole">
        insert into user_role values(#{
   
   user.user_id},#{
   
   role.role_id})
    </insert>

3.テストクラス、皆さんの理解を深めるために、テストを行うことができます。
次のコードからわかります。userを挿入した後、クエリなどの他の操作を実行せずに、user_idを出力して中間テーブルに挿入できます。

Date date = new Date();
        User user = new User("mike33", "male", "[email protected]", "183xxxxxxxx", "chengdu", date, 1);
        Role role = new Role();
        role.setRole_id(4);
        //插入user
        service.insert(user);
        //打印user_id
        System.out.println("user_id----->>>>" + user.getUser_id());
        //插入中间表
        service.insertUserRole(user, role);

結果:直接挿入した後、user_idを取得し、中間テーブルを挿入できることがわかります。これにより、この問題が解決されます。

もちろん、新しいユーザーを挿入するため、ユーザーとロールのマッピングを同時に満たす必要があるため、ここでは、挿入プロセスの整合性を確保するためにSpringトランザクションを使用します。
アノテーションを使用して達成します。

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
    public void insertUserRole(User user, Role role) {
        this.insert(user);
        mapper.insertUserRole(user, role);
    }

おすすめ

転載: blog.csdn.net/u010857795/article/details/71512044
おすすめ