Partage de technologie

Comment implémenter la jointure gauche Mybatis

2024-07-12

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

Lorsque nous utilisons MyBatis Plus pour les opérations de base de données, nous devons parfois obtenir des données de plusieurs tables. Cet article explique comment implémenter une requête de jointure gauche dans MyBatis Plus. Nous prendrons comme exemple deux tables, l'une est la table du chef de service (system_dept_leader), et l'autre est la table utilisateur (system_user), et montre comment obtenir les informations détaillées du chef de service via une jointure gauche, y compris le surnom et le numéro de travail de l'utilisateur.

Structure du tableau de données

Supposons que nous ayons les deux tableaux de données suivants :

Table de direction du département (system_dept_leader)

Nom de domainetaperdécrire
identifiantentifiantLongclé primaire
département_idLongNuméro de service
ID de l'utilisateurLongID de l'utilisateur
est_primaireEntierEst-ce important

 

table utilisateur (system_user)

Nom de domainetaperdécrire
identifiantentifiantLongclé primaire
surnomChaîneSurnom
code_travailleurChaîneNuméro de travail

Étapes de mise en œuvre

Nous allons implémenter la requête de jointure gauche en suivant les étapes suivantes :

  1. Définir la classe de résultat de la requête
  2. Écrire un fournisseur SQL
  3. Définir la méthode de requête dans l'interface Mapper

1. Définir la classe de résultats de la requête

Tout d’abord, nous devons définir une classe de résultats de requête pour stocker les résultats de la requête.Nous définissons ici unDeptLeaderDORespVO Classe, héritée de la classe de baseDeptLeaderDOBaseVO, et contient les champs de surnom et de numéro de travail de l'utilisateur.

  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. Écrivez un fournisseur SQL

Ensuite, nous écrivons une classe de fournisseur SQL pour générer dynamiquement des requêtes SQL.utilisé iciSelectProvider Annotations pour spécifier du SQL personnalisé.

  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. Définir la méthode de requête dans l'interface Mapper

Enfin, définissez la méthode de requête dans l'interface Mapper et utilisez SelectProvider L'annotation spécifie le fournisseur 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. Appelez la méthode de la couche de service

La méthode de requête est appelée dans la couche de service et les résultats sont renvoyés au front-end ou traités ultérieurement.

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

Résumer

Grâce aux étapes ci-dessus, nous avons mis en œuvre la méthode d'utilisation de la jointure gauche pour interroger les informations détaillées des chefs de service dans MyBatis Plus. Cette méthode peut générer dynamiquement des requêtes SQL basées sur les conditions entrantes pour obtenir des informations sur les chefs de service et leurs utilisateurs associés. Cette méthode est très utile lorsque la requête de données doit être effectuée sur plusieurs tables, garantissant la flexibilité et l'efficacité de la requête de données.

J'espère que cet article pourra vous aider à mieux comprendre et utiliser MyBatis Plus pour des requêtes complexes. Si vous avez des questions ou d'autres besoins, vous êtes invités à discuter et à communiquer.