Mybatis-plus 다 세대 실현 방안 에 대한 상세 한 설명

머리말
편집장 은 먼저 다 세입 자가 무엇 인지,어떤 장면 에서 다 세입 자 를 사용 하 는 지 설명 한다.
다 세입 자 는 일종 의 소프트웨어 구조 기술 로 다 중 사용자 의 환경 에서 모두 같은 시스템 을 가지 고 데이터 간 의 격 리 성에 주의해 야 한다.
실제 예 를 들 어 소 편 은 알 리 페 이 프로그램 을 개발 한 적 이 있다.이 프로그램 은 서로 다른 애플 리 케 이 션 에 응용 되 고 사용자 가 서로 다른 애플 리 케 이 션 페이지 에 들 어가 면 애플 리 케 이 션 은 사용자 관련 데 이 터 를 소 편 으로 전송 한다.데 이 터 를 격 리 할 수 있 도록 전송 할 때 애플 릿 ID(세입 자 ID)를 달 아야 한다.
서로 다른 세입 자가 같은 프로그램 을 사용 할 때 데이터 격 리 상황 을 고려 해 야 한다.
데이터 격 리 는 세 가지 방안 이 있 습 니 다.
1.독립 데이터 베이스:쉽게 말 하면 한 세입 자가 데이터 베 이 스 를 사용 하 는 것 이다.이런 데이터 격 리 등급 이 가장 높 고 안전성 이 가장 좋 지만 원 가 를 높 인 다.
2.공유 데이터베이스,격 리 데이터 구조:다 세대 가 같은 데이터 바 지 를 사용 하지만 모든 세입 자 는 하나의 Schema(데이터베이스 user)에 대응 합 니 다.-
3.공유 데이터베이스,공유 데이터 구조:같은 데이터 베 이 스 를 사용 하고 같은 Schema 를 사용 하지만 표 에 세입 자 ID 필드 를 추 가 했 습 니 다.이런 공유 데이터 수준 이 가장 높 고 격 리 수준 이 가장 낮 습 니 다.
구체 적 실현
여기 서 방안 3,즉 데이터 베 이 스 를 공유 하고 데이터 구 조 를 공유 합 니 다.이런 방안 은 서버 원가 가 가장 낮 지만 개발 원 가 를 높 였 기 때 문 입 니 다.
구조 논리 구현:

Mybatis-plus 다 세대 실현 방안
Mybatis-plus 는 다 세대 솔 루 션 을 제공 합 니 다.실현 방식 은 페이지 플러그 인(차단기)을 바탕 으로 이 루어 집 니 다.
첫 번 째 단계:응용 프로그램 에 tenant(세입 자 표)를 추가 하고 격 리 가 필요 한 데이터 시트 에 세입 자 id 를 추가 합 니 다.
두 번 째 단계:Tenant Handler 인 터 페 이 스 를 실현 하고 이 를 실현 하 는 방법:

public interface TenantHandler {

  /**
   *      ID     ,     ID     
   * <p>
   *         ,  :tenant_id in (1,2) @since 2019-8-2
   *
   * @param where    true     where    false     insert    select   
   * @return    ID     
   */
  Expression getTenantId(boolean where);

  /**
   *        
   *
   * @return      
   */
  String getTenantIdColumn();

  /**
   *             
   *
   * @param tableName   
   * @return       , true:    ,false:         
   */
  boolean doTableFilter(String tableName);
}
PreTenant Handler Tenant Handler 실현

@Slf4j
@Component
public class PreTenantHandler implements TenantHandler {

  @Autowired
  private PreTenantConfigProperties configProperties;

  /**
   *   Id
   *
   * @return
   */
  @Override
  public Expression getTenantId(boolean where) {
    //                 id 
    Long tenantId = PreTenantContextHolder.getCurrentTenantId();
    log.debug("     {}", tenantId);
    if (tenantId == null) {
      return new NullValue();
    }
    return new LongValue(tenantId);
  }
  /**
   *      
   *
   * @return
   */
  @Override
  public String getTenantIdColumn() {
    return configProperties.getTenantIdColumn();
  }

  /**
   *             
   *       :    (sys_tenant)            
   *
   * @param tableName
   * @return
   */
  @Override
  public boolean doTableFilter(String tableName) {
    return configProperties.getIgnoreTenantTables().stream().anyMatch((e) -> e.equalsIgnoreCase(tableName));
  }
}
세 번 째 단계:mybatisPlus 의 페이지 플러그 인 설정

@EnableTransactionManagement
@Configuration
@MapperScan({"com.xd.pre.**.mapper"})
public class MyBatisPlusConfig {

  @Autowired
  private PreTenantHandler preTenantHandler;

  /**
   *     
   */
  @Bean
  public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    List<ISqlParser> sqlParserList = new ArrayList<>();
    //    SQL      、     
    sqlParserList.add(new BlockAttackSqlParser());
    //      
    TenantSqlParser tenantSqlParser = new TenantSqlParser();
    tenantSqlParser.setTenantHandler(preTenantHandler);
    sqlParserList.add(tenantSqlParser);
    paginationInterceptor.setSqlParserList(sqlParserList);
    return paginationInterceptor;
  }
}
설정 이 완료 되면 조회,추가,삭제 방법 을 수정 할 때 MP 는 자동 으로 세입 자 ID 표 지 를 추가 합 니 다.테스트 는 다음 과 같 습 니 다.

  @Test
  public void select(){
    List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getAge, 18));
    users.forEach(System.out::println);
  }
sql 인 스 턴 스 실행:

DEBUG==> Preparing: SELECT id, login_name, name, password, 
      email, salt, sex, age, phone, user_type, status,
     organization_id, create_time, update_time, version,
     tenant_id FROM sys_user 
   WHERE sys_user.tenant_id = '001' AND is_delete = '0' AND age = ? 
주:특정 SQL 필터 프로그램 에서 일부 SQL 은 세입 자 ID 표시 없 이 특정 sql 을 걸 러 내야 하 며 다음 과 같은 두 가지 방식 을 사용 할 수 있 습 니 다.
방식 1:설정 페이지 플러그 인 에 ISqlParserFilter 해상도 기 를 추가 합 니 다.SQL 을 많이 설정 하면 귀 찮 습 니 다.권장 하지 않 습 니 다.

paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
      @Override
      public boolean doFilter(MetaObject metaObject) {
        MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
        //   Mapper、dao    
        if("com.example.demo.mapper.UserMapper.selectList".equals(ms.getId())){
          return true;
        }
        return false;
      }
    });
방식 2:세입 자 주석@SqlParser(filter=true)형식 을 통 해 현재 Mapper 방법 에 만 사용 할 수 있 습 니 다.

public interface UserMapper extends BaseMapper<User> {
 
  /**
   *   Wrapper  
   *
   * @param userWrapper      
   * @param user           
   * @return
   */
  @SqlParser(filter = true)
  int updateByMyWrapper(@Param(Constants.WRAPPER) Wrapper<User> userWrapper, @Param("user") User user);
 
}
주:

Mybatis-plus 다 세대 구현 방안 에 대한 상세 한 설명 은 여기까지 입 니 다.Mybatis-plus 다 세대 콘 텐 츠 는 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기