技術共有

Mybatis 左結合の実装方法

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

MyBatis Plus をデータベース操作に使用する場合、複数のテーブルからデータを取得する必要がある場合があります。この記事では、MyBatis Plus で左結合クエリを実装する方法を紹介します。例として 2 つのテーブルを取り上げます。1 つは部門長テーブル (system_dept_leader)、もう 1 つはユーザー テーブル (system_user)、左結合を通じて、ユーザーのニックネームや勤務先番号などの部門リーダーの詳細情報を取得する方法を示します。

データテーブル構造

次の 2 つのデータ テーブルがあるとします。

部門リーダー表 (system_dept_leader)

フィールド名タイプ説明する
id長さ主キー
部門ID長さ部門ID
ユーザーID長さユーザーID
プライマリ整数大切ですか

 

ユーザーテーブル (system_user)

フィールド名タイプ説明する
id長さ主キー
ニックネームニックネーム
ワーカーコードジョブ番号

実装手順

次の手順で左結合クエリを実装します。

  1. クエリ結果クラスの定義
  2. SQLプロバイダーの作成
  3. Mapperインターフェイスでクエリメソッドを定義します。

1. クエリ結果クラスを定義する

まず、クエリ結果を保存するためのクエリ結果クラスを定義する必要があります。ここで定義します DeptLeaderDORespVO 基本クラスから継承されたクラスDeptLeaderDOBaseVO、ユーザーのニックネームと勤務先番号のフィールドが含まれます。

  1. @Data
  2. @EqualsAndHashCode(callSuper = true)
  3. @ToString(callSuper = true)
  4. public class DeptLeaderDORespVO extends DeptLeaderDOBaseVO {
  5. private Long id;
  6. @NotNull(message = "Department不能为空")
  7. private Long deptId;
  8. @NotNull(message = "User不能为空")
  9. private Long userId;
  10. @NotNull(message = "Is Primary不能为空")
  11. private Integer isPrimary;
  12. private String nickname;
  13. private String workerCode;
  14. }

2. SQL プロバイダーを作成する

次に、SQL クエリを動的に生成するための SQL プロバイダー クラスを作成します。ここで使われている SelectProvider カスタム SQL を指定するためのアノテーション。

  1. public class DeptLeaderSqlProvider {
  2. public String selectDeptLeaderWithUserDetails(Map<String, Object> params) {
  3. Long deptId = (Long) params.get("deptId");
  4. Long userId = (Long) params.get("userId");
  5. Integer isPrimary = (Integer) params.get("isPrimary");
  6. StringBuilder sql = new StringBuilder();
  7. sql.append("SELECT dl.*, su.nickname, su.worker_code AS workerCode ");
  8. sql.append("FROM system_dept_leader dl ");
  9. sql.append("LEFT JOIN system_user su ON dl.user_id = su.id ");
  10. sql.append("WHERE 1=1 ");
  11. if (deptId != null) {
  12. sql.append("AND dl.dept_id = #{deptId} ");
  13. }
  14. if (userId != null) {
  15. sql.append("AND dl.user_id = #{userId} ");
  16. }
  17. if (isPrimary != null) {
  18. sql.append("AND dl.is_primary = #{isPrimary} ");
  19. }
  20. sql.append("ORDER BY dl.id DESC");
  21. return sql.toString();
  22. }
  23. }

3. Mapperインターフェイスでクエリメソッドを定義します。

最後に、Mapper インターフェイスでクエリ メソッドを定義し、次を使用します。 SelectProvider 注釈は SQL プロバイダーを指定します。

  1. @Mapper
  2. public interface DeptLeaderMapper extends BaseMapperX<DeptLeaderDO> {
  3. @SelectProvider(type = DeptLeaderSqlProvider.class, method = "selectDeptLeaderWithUserDetails")
  4. List<DeptLeaderDORespVO> selectDeptLeaderWithUserDetails(@Param("deptId") Long deptId,
  5. @Param("userId") Long userId,
  6. @Param("isPrimary") Integer isPrimary);
  7. }

4. サービス層メソッドを呼び出す

クエリ メソッドはサービス層で呼び出され、結果はフロントエンドに返されるか、さらに処理されます。

  1. @Service
  2. public class DeptLeaderService {
  3. @Autowired
  4. private DeptLeaderMapper deptLeaderMapper;
  5. public List<DeptLeaderDORespVO> getDeptLeaders(Long deptId, Long userId, Integer isPrimary) {
  6. return deptLeaderMapper.selectDeptLeaderWithUserDetails(deptId, userId, isPrimary);
  7. }
  8. }

要約する

以上の手順で、MyBatis Plus の部門リーダーの詳細情報を左結合で問い合わせる方法が実装できました。この方法では、受信条件に基づいて SQL クエリを動的に生成し、部門リーダーとその関連ユーザーに関する情報を取得できます。この方法は、複数のテーブルにわたってデータ クエリを実行する必要がある場合に非常に役立ち、データ クエリの柔軟性と効率を確保します。

この記事が、MyBatis Plus をよりよく理解し、複雑なクエリに使用するのに役立つことを願っています。ご質問やさらなるニーズがございましたら、お気軽にご相談ください。