인터뷰를 여기에서 찾으십시오! 정보가 분류되어 있습니다. 무엇을 기다리고 있습니까? 생각해 내다! 2020 최신 Java 공통 인터뷰 질문 모음 + 자세한 답변 (11)

2020 최신 Java 공통 인터뷰 질문 모음 + 자세한 답변 (11)

Java 관련 자료를 계속 업데이트하십시오. 최근에는 좀 더 포괄적 인 인터뷰 정보를 수집하기 위해 거물들의 최신 인터뷰 뉴스를 7 일 동안 컨설팅했습니다. 처음 몇 개의 컬렉션을 보려면 내 홈페이지로 이동하여 찾을 수 있습니다.

답변 중 일부는 직접 요약하고 일부는 인터넷에서 수집합니다. 이 인터뷰를보고 당황하지 마세요! 더 많은 경험이 있으시면 댓글로 공유 해주시고, 실수가 있으시면 언제든지 말씀 해주시면 감사하겠습니다.

13. 미 바티스

104. mybatis에서 # {}와 $ {}의 차이점은 무엇입니까?

  • # {}는 사전 컴파일 처리이고 $ {}는 문자열 대체입니다.

  • Mybatis가 # {}를 처리 할 때 SQL의 # {}을 기호로 바꾸고 PreparedStatement의 set 메서드를 호출하여 할당합니다.

  • Mybatis가 $ {}를 처리 할 때 $ {}를 변수 값으로 바꿉니다.

  • # {}를 사용하면 SQL 삽입을 효과적으로 방지하고 시스템 보안을 향상시킬 수 있습니다.

 

105. mybatis에는 몇 개의 페이징 방법이 있습니까?

 

  1. 번호 그룹 페이지

  2. SQL 페이징

  3. 인터셉터 페이징

  4. RowBounds 페이지 매김

 

106. mybatis 논리적 페이징과 물리적 페이징의 차이점은 무엇입니까?

 

  • 물리적 페이징이 반드시 논리적 페이징보다 빠르지는 않으며 논리적 페이징이 반드시 물리적 페이징보다 빠르지는 않습니다.

  • 물리적 페이징은 항상 논리적 페이징보다 낫습니다. 데이터베이스 쪽에서 애플리케이션쪽에 압력을 가할 필요가 없습니다. 속도면에서 이점이 있더라도 다른 성능 이점이 이러한 단점을 보완 할 수 있습니다.

질문의자가 점검 후 자세한 답변을 보면 더욱 효과적입니다.

107. mybatis는 지연 로딩을 지원합니까? 지연 로딩의 원리는 무엇입니까?

 

Mybatis는 연관 객체 및 컬렉션 객체의 지연로드 만 지원합니다. 연관은 일대일, 컬렉션은 일대 다 쿼리를 나타냅니다. Mybatis 구성 파일에서 lazyLoadingEnabled = true | false를 활성화할지 여부를 구성 할 수 있습니다.

 

그 원칙은 CGLIB를 사용하여 대상 객체의 프록시 객체를 만드는 것입니다. 대상 메서드가 호출되면 a.getB (). getName () 호출과 같은 인터셉터 메서드를 입력하면 인터셉터 invoke () 메서드가 a.getB ()가 null 값이면 이전에 저장된 B 객체와 연관된 SQL 쿼리를 별도로 보내고 B를 쿼리 한 다음 a.setB (b)를 호출하므로 a의 객체 b 속성에 값이있는 다음 a.getB (를 완료합니다. ) .getName () 메서드 호출. 이것이 지연 로딩의 기본 원리입니다.

 

물론 Mybatis뿐만 아니라 Hibernate를 포함한 거의 모든 것이 동일한 원리로 지연 로딩을 지원합니다.

 

108. mybatis의 첫 번째 수준 캐시와 두 번째 수준 캐시에 대해 알려주세요.

 

레벨 1 캐시 : PerpetualCache를 기반으로하는 HashMap 로컬 캐시. 저장 범위는 세션입니다. 세션을 플러시하거나 닫으면 세션의 모든 캐시가 비워지고 레벨 1 캐시가 기본적으로 설정됩니다.

 

두 번째 레벨 캐시의 메커니즘은 첫 번째 레벨 캐시의 메커니즘과 동일합니다. 기본적으로 PerpetualCache 및 HashMap 스토리지도 사용됩니다. 차이점은 스토리지 범위가 Mapper (네임 스페이스)이고 Ehcache와 같은 스토리지 소스를 사용자 정의 할 수 있다는 것입니다. 2 단계 캐시는 기본적으로 설정되어 있지 않습니다. 2 단계 캐시를 활성화하려면 2 단계 캐시 속성 클래스를 사용하여 직렬화 가능 직렬화 인터페이스 (객체의 상태를 저장하는 데 사용할 수 있음)를 구현해야하며 매핑 파일 <cache />에서 구성 할 수 있습니다.

 

캐시 데이터 업데이트 메커니즘의 경우 특정 범위 (첫 번째 수준 캐시 세션 / 두 번째 수준 캐시 네임 스페이스)에서 C / U / D 작업을 수행하면이 범위 아래에서 선택한 모든 캐시가 기본적으로 지워집니다.

 

109. mybatis와 hibernate의 차이점은 무엇입니까?

 

(1) MyBatis는 프로그래머가 Sql 문을 작성해야하기 때문에 최대 절전 모드와 다르며 정확히 ORM 프레임 워크가 아닙니다.

 

(2) Mybatis는 SQL의 실행 성능을 엄격하게 제어 할 수 있고 유연성이 높은 원래의 생태 SQL을 직접 작성합니다. 이러한 유형의 소프트웨어 요구 사항이 자주 변경되고 요구 사항이 변경되면 빠른 출력이 필요하기 때문에 관계형 데이터 모델에 대한 높은 요구 사항이 필요하지 않은 소프트웨어 개발에 매우 ​​적합합니다. . 하지만 유연성의 전제는 mybatis가 데이터베이스 독립성을 달성 할 수 없다는 것입니다. 여러 데이터베이스를 지원하는 소프트웨어를 구현해야하는 경우 여러 SQL 매핑 파일 세트를 사용자 정의해야하는데 많은 작업이 필요합니다. 

 

(3) Hibernate는 강력한 객체 / 관계형 매핑 기능과 우수한 데이터베이스 독립성을 가지고 있으며, 관계형 모델에 대한 요구 사항이 높은 소프트웨어의 경우 hibernate로 개발하면 많은 코드를 절약하고 효율성을 높일 수 있습니다. 

110. mybatis에는 어떤 집행자 (Executor)가 있습니까?

 

Mybatis에는 세 가지 기본 실행자 (Executor)가 있습니다.

 

  1. SimpleExecutor : 업데이트 또는 선택이 실행될 때마다 Statement 객체가 열리고 사용 직후 Statement 객체가 닫힙니다.

  2. ReuseExecutor : 업데이트를 실행하거나 선택하고, sql을 키로 사용하여 Statement 객체를 찾고, 존재하면 사용하고, 존재하지 않으면 생성합니다. 사용 후 Statement 객체는 닫히지 않고 다음 사용을 위해 Map에 배치됩니다. 간단히 말해 Statement 객체를 재사용하는 것입니다.

  3. BatchExecutor : 업데이트 실행 (선택 없음, JDBC 일괄 처리는 선택을 지원하지 않음), 모든 SQL을 일괄 처리에 추가 (addBatch ()), 통합 실행 대기 (executeBatch ()), 여러 Statement 객체를 각각 캐시합니다. 명령문 객체는 모두 addBatch ()가 완료된 후 executeBatch () 일괄 처리를 하나씩 대기합니다. JDBC 일괄 처리와 동일합니다.

 

111. mybatis 페이징 플러그인의 실현 원리는 무엇입니까?

 

페이징 플러그인의 기본 원칙은 Mybatis에서 제공하는 플러그인 인터페이스를 사용하여 사용자 정의 플러그인을 구현하고, 플러그인의 차단 방법에서 실행할 SQL을 가로 챈 다음, 방언에 따라 SQL을 다시 작성하고, 해당 물리적 ​​페이징 문과 물리적 페이징 매개 변수를 추가하는 것입니다.

 

112. mybatis는 사용자 정의 플러그인을 어떻게 작성합니까?

 

전송 위치 : blog.csdn.net/qq_30051265/article/details/80266434

 

Mybatis 사용자 정의 플러그인은 Mybatis의 네 가지 주요 객체 (Executor, StatementHandler, ParameterHandler 및 ResultSetHandler)를 인터셉트합니다. 특정 인터셉트 방법은 다음과 같습니다. 

  • 실행자 : 실행자를 가로채는 방법 (로그 레코드) 

  • StatementHandler : SQL 구문 생성 처리 차단 

  • ParameterHandler : 매개 변수 처리 차단 

  • ResultSetHandler : 결과 세트 처리를 가로 챕니다. 

 

Mybatis 사용자 정의 플러그인은 인터셉터 인터페이스를 구현해야합니다.

public interface Interceptor {
    Object intercept(Invocation invocation) throws Throwable;
    Object plugin(Object target);
    void setProperties(Properties properties);
}

인터셉트 방법 : 인터셉터 특정 처리 논리 방법 

플러그인 방법 : 서명 맵을 기반으로 동적 프록시 개체 생성 

setProperties 메서드 : Properties 속성 설정

사용자 정의 플러그인 데모 :

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
  Object target = invocation.getTarget(); //被代理对象
  Method method = invocation.getMethod(); //代理方法
  Object[] args = invocation.getArgs(); //方法参数
  // do something ...... 方法拦截前执行代码块
  Object result = invocation.proceed();
  // do something .......方法拦截后执行代码块
  return result;
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}

하나의 @Intercept는 여러 @Signatures로 구성 할 수 있습니다. @Signature의 매개 변수는 다음과 같이 정의됩니다. 

  • 유형 : 인터셉트 된 클래스를 나타냅니다. 여기에 Executor의 구현 클래스가 있습니다.

  • method : 가로 채기 방법을 나타냅니다. 여기에 Executor를 가로채는 업데이트 방법이 있습니다.

  • args : 메서드 매개 변수를 나타냅니다.

    마침내

    인터뷰 질문의 내용은 여기에 있으며, 후속 업데이트에서 더 많은 업데이트가있을 것입니다. 모두에게 도움이 되길 바랍니다.

    마지막으로 여러분 께 한 말씀 드리고 싶습니다 저는 수년 동안 일해 왔으며 다른 사람들을 위해 어떤 사람들을 인터뷰했습니다. 면접관이나 리더의 관점에서 면접 기술과 경험 외에도 훌륭한 기술과 프로젝트 경험은 그들의 트럼프 카드이자 자신감입니다. 1 차 제조업체의 핵심 기술 공유

     학습 자료를 정리하는 데 오랜 시간이 걸렸습니다. 위에 게시 한 내용은 자료에있는 빙산의 일각입니다. 도와 드릴 수 있기를 바랍니다! 비밀 코드를 함께 배우려면 클릭하십시오 : csdn

                             

      후속으로 더 많은 순수 건조 제품 기사를 공유하고 정말 도움이되기를 바랍니다. 귀하의 지원은 저의 가장 큰 동기입니다! 팔로우에 오신 것을 환영합니다!

                                                           

추천

출처blog.csdn.net/weixin_50333534/article/details/108967338