Обмен технологиями

Как реализовать левое соединение Mybatis

2024-07-12

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

При использовании MyBatis Plus для операций с базой данных нам иногда необходимо получить данные из нескольких таблиц. В этой статье рассказывается, как реализовать запрос левого соединения в MyBatis Plus. В качестве примера возьмем две таблицы: одна — таблица руководителя отдела (system_dept_leader), а другой — пользовательская таблица (system_user) и демонстрирует, как получить подробную информацию о руководителе отдела с помощью левого соединения, включая псевдоним пользователя и рабочий номер.

Структура таблицы данных

Предположим, у нас есть следующие две таблицы данных:

Таблица руководства отделом (system_dept_leader)

Имя полятипописывать
идентификаторДлинныйосновной ключ
dept_idДлинныйИдентификатор отдела
ID пользователяДлинныйID пользователя
is_primaryЦелое числоЭто важно

 

пользовательская таблица (system_user)

Имя полятипописывать
идентификаторДлинныйосновной ключ
прозвищеНитьНик имя
код_работникаНитьНомер задания

Этапы реализации

Мы реализуем запрос левого соединения, выполнив следующие шаги:

  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 для сложных запросов. Если у вас есть какие-либо вопросы или дополнительные потребности, вы можете обсудить и пообщаться.