この従業員管理システムのデモを行う場合、ユーザーとロールは多対多の関係にあり、ユーザーの主キーは自己増加するため、この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);
}