Technologieaustausch

So implementieren Sie den linken Join von Mybatis

2024-07-12

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

Wenn wir MyBatis Plus für Datenbankoperationen verwenden, müssen wir manchmal Daten aus mehreren Tabellen abrufen. In diesem Artikel wird erläutert, wie Sie eine Left-Join-Abfrage in MyBatis Plus implementieren. Wir nehmen als Beispiel zwei Tabellen, eine davon ist die Abteilungsleitertabelle (system_dept_leader), und das andere ist die Benutzertabelle (system_user) und demonstriert, wie man die detaillierten Informationen des Abteilungsleiters über einen Left Join erhält, einschließlich des Spitznamens und der Arbeitsnummer des Benutzers.

Datentabellenstruktur

Angenommen, wir haben die folgenden zwei Datentabellen:

Abteilungsleitertabelle (system_dept_leader)

FeldnameTypbeschreiben
AusweisLangPrimärschlüssel
Abteilungs-IDLangAbteilungs-ID
Benutzer-IDLangBenutzer-ID
ist_primärGanze ZahlIst es wichtig

 

Benutzertabelle (system_user)

FeldnameTypbeschreiben
AusweisLangPrimärschlüssel
SpitznameZeichenfolgeSpitzname
ArbeitercodeZeichenfolgeAuftragsnummer

Umsetzungsschritte

Wir werden die Left-Join-Abfrage durch die folgenden Schritte implementieren:

  1. Abfrageergebnisklasse definieren
  2. Schreiben eines SQL-Anbieters
  3. Definieren Sie die Abfragemethode in der Mapper-Schnittstelle

1. Abfrageergebnisklasse definieren

Zuerst müssen wir eine Abfrageergebnisklasse definieren, um Abfrageergebnisse zu speichern.Hier definieren wir aDeptLeaderDORespVO Klasse, geerbt von der BasisklasseDeptLeaderDOBaseVOund enthält die Felder „Spitzname“ und „Arbeitsnummer“ des Benutzers.

  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. Schreiben Sie einen SQL-Anbieter

Als nächstes schreiben wir eine SQL-Provider-Klasse zum dynamischen Generieren von SQL-Abfragen.hier verwendetSelectProvider Anmerkungen zur Angabe von benutzerdefiniertem 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. Definieren Sie die Abfragemethode in der Mapper-Schnittstelle

Definieren Sie abschließend die Abfragemethode in der Mapper-Schnittstelle und verwenden Sie sie SelectProvider Die Annotation gibt den SQL-Anbieter an.

  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. Rufen Sie die Service-Layer-Methode auf

Die Abfragemethode wird im Service-Layer aufgerufen und die Ergebnisse an das Frontend zurückgegeben oder weiterverarbeitet.

  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. }

Zusammenfassen

Durch die oben genannten Schritte haben wir die Methode implementiert, mithilfe von Left Join die detaillierten Informationen von Abteilungsleitern in MyBatis Plus abzufragen. Diese Methode kann dynamisch SQL-Abfragen basierend auf den eingehenden Bedingungen generieren, um Informationen über Abteilungsleiter und die zugehörigen Benutzer zu erhalten. Diese Methode ist sehr nützlich, wenn die Datenabfrage über mehrere Tabellen hinweg durchgeführt werden muss, um die Flexibilität und Effizienz der Datenabfrage sicherzustellen.

Ich hoffe, dieser Artikel kann Ihnen helfen, MyBatis Plus besser zu verstehen und für komplexe Abfragen zu verwenden. Wenn Sie Fragen oder weitere Bedürfnisse haben, können Sie diese gerne besprechen und kommunizieren.