우리를 위해 무엇을 할 수 MyBatis로 스프링
MyBatis로 워크가 매우 좋았다, 그것을 구성하고 SQL 초록을 실행하는 일반적인 방법이다. 당신이 인터페이스의 메서드를 실행할 때보다도 우리가 올바른 구성을 한 다음 모델, 인터페이스 층, SQL 문을있다, 프레임 워크의 요구 사항을 충족하고, 빈 정의 인터페이스 및 SQL 동료를 할만큼 MyBatis로, 다음, 프레임 워크는 MyBatis로합니다 당신을 위해 실행 해당 SQL 문을 발견 한 후 그 결과를 실행하고 반환합니다.
그러나 가장 큰 문제는 많은 빈 정의는, 손으로 쓴 하나 하나이어야하며, 이름과 인터페이스와 SQL의 위치를 정확하게 작성 될 수 있도록한다는 것입니다, 충분하지 않습니다. 가장 큰 기여는 그 MyBatis로 스프링 빈 스캐닝 메커니즘에있다 음이 적절하게 사용 한, 그것은 자동으로 모든 인터페이스와 SQL 문을 검색 할 수 있습니다, 그들을 동료 bean 정의를 설정할 수 있습니다. 봄도 매우 멋지다 동적 캐시 Bean 정의를 만들 수 있습니다.
또한, 스프링 프레임 워크에 통합하기 때문에, 구성 정보 및 정보 SqlSessionFactory는 등을 MyBatis로도 봄 콩을 관리 할 수 있습니다. 봄의 수준을 캐싱 몇 가지 작업을 수행 할 수 있습니다.
MyBatis로 SQL의 전체 프로세스를 수행
우리는 하나의 메커니즘 MyBatis로, 부하의 전체 과정과 SQL의 구성을 실행 되돌아 본다.
// 구성 생성, 구성 파일을 구문 분석 문자열 자원 = "MyBatis로 - 더 config.xml에" , 해, InputStream inputStream을 = Resources.getResourceAsStream (자원); // 구성하는 빌드 SqlSessionFactory는에 따르면 = A SqlSessionFactory는 SqlSessionFactory는 새로운 새로운 SqlSessionFactoryBuilder를 () 구축 (inputStream을); //이 SQLSESSION 진정으로 사용할 수 SQLSESSION SQLSESSION = sqlSessionFactory.openSession (); //은 SQLSESSION의 인터페이스에서 에이전트를 가져옵니다 . (ArticleMapper ArticleMapper articleMapperProxy = sqlSession.getMapper 클래스 ); //는 프록시 클래스의 방법을 수행 = 제 기사 articleMapperProxy을. selectByPrimaryKey ( "123" ); // 다음 작업은 기사를 생략한다
MyBatis로 스프링 부팅 프로세스
의 시작 프로세스 MyBatis로 스프링 프레임을 가정 해 봅시다. MyBatis로-봄 SqlSessionFactory는 SQLSESSION를 인수하고, 프록시 클래스 sqlSessionProxy을 만들기로 결정이 SQLSESSION입니다. 또한, 스프링의 MyBatis 스캔 가능한 인터페이스 맵퍼 모든 계층의 모든 프록시 클래스 위에 다음 맵퍼. 2 라인의 휴식 내려.
행 1 : SqlSessionFactory는 초기화 및 SQLSESSION
- sqlSessionFactoryBean 만들기, 그것은 Spring 관리 빈 공장이 될 것입니다
- 스프링 빈에 의해 관리됩니다 만들기 SqlSessionFactory는은, 카테고리의 MyBatis에 속하는
- SqlSessionFactory는 할 sqlSessionTemplate를, 만들기, 카테고리 MyBatis로 스프링에 속하는
- sqlSessionProxy 만들기
SqlSessionFactory는 매우 중요한 팩토리 클래스이며, 이제 SqlSessionFactory는이 정보가 무엇인지 살펴 보자 :
중요 정보 #의 SqlSessionFactory는 SqlSessionFactory는이 구성 환경 #이는 dataSource 정보 mapperRegistry의 구성 정보의 내부 구성 # knownMappers 번호 모든 매퍼가있는 모든 메소드의 모든 매퍼 mappedStatements 번호가 resultMaps # 모든 XML 모든적인 resultMap 있습니다 sqlFragments # 내부를 모든 세그먼트는 SQL을
이 정보는 중요하고, 필요가 가까운 미래에 내부 정보를 사용하는 경우 sqlSessionProxy mapperProxy은 미래에서 만든 만듭니다.
MyBatis로 스프링 프레임, Spring에 의해 관리 SqlSessionFactory는에서의이 SqlSessionFactory는을 만드는 방법을 살펴 보자.
1 @Bean (NAME = "SqlSessionFactory는이" ) 2 공개 SqlSessionFactory는 SqlSessionFactory는 (데이터 소스 데이터 소스)이 발생 예외 { 3 SqlSessionFactoryBean = 공장을 새로운 SqlSessionFactoryBean (); 4 factory.setDataSource (는 dataSource); 도 5 의 경우 (StringUtils.hasText ( 이 .properties.getConfig ())) { 6 factory.setConfigLocation ( 이 .resourceLoader.getResource ( 이 .properties.getConfig ())); 7 } 다른 { 8 경우 ( 이! = .interceptors 널 && 이 .interceptors.length> 0 ) { 9 factory.setPlugins ( 이 .interceptors); 10 } 11 factory.setTypeAliasesPackage ( 이 .properties.getTypeAliasesPackage ()); 12 factory.setTypeHandlersPackage ( 이 .properties.getTypeHandlersPackage ()); 13 factory.setMapperLocations ( 이 .properties.getMapperLocations ()); 14 } 15 리턴 factory.getObject (); 16 }
참고 : SqlSessionFactoryBean
역할은 구성 MyBatis로 (소스 데이터, 별명 등)을 분석하는 것입니다, 다음 GetObject 메서드에 의해 SqlSessionFactory는 인스턴스를 반환하는 식물 콩입니다. 우리는 초기화 중에 무슨 일 SqlSessionFactoryBean 봐.
우리가 SqlSessionFactoryBean 소스를 살펴 보자 :
1 개 공용 클래스 SqlSessionFactoryBean은 구현 의 FactoryBean <SqlSessionFactory는> InitializingBean 표시, 만약 ApplicationListener <가 ApplicationEvent> { 2 개인 정적 최종 로그인 LOGGER = LogFactory.getLog (SqlSessionFactoryBean. 클래스 ); 3 개인 리소스 configLocation; 4 개인 설정 구성; 5 개인 리소스 [] mapperLocations; 6 개인 데이터 소스 데이터 소스; 7 개인 TransactionFactory transactionFactory; 8 개인등록 configurationProperties; 9 개인 SqlSessionFactoryBuilder를 SqlSessionFactoryBuilder를 = 새로운 SqlSessionFactoryBuilder를 (); 10 개인 SqlSessionFactory는 SqlSessionFactory는; (11) 개인 문자열 환경 = SqlSessionFactoryBean. 클래스 .getSimpleName (); 12 전용 부울 FAILFAST; 13 개인 인터셉터 [] 플러그; 14 개인 <?> TypeHandler [] typeHandlers; 15 개인 문자열 typeHandlersPackage; 16 개인 <?> 클래스 [] typeAliases; (17) 개인 문자열 typeAliasesPackage; 18 개 개인 클래스 <?> typeAliasesSuperType; 19 개인 DatabaseIdProvider databaseIdProvider; 20 개 개인 클래스 <? 연장 VFS> VFS 단계; 21 개인 캐시 캐시; 22 개인 ObjectFactory를 ObjectFactory를; 23 개인 ObjectWrapperFactory objectWrapperFactory; 24 25 공중 SqlSessionFactoryBean () { 26 } 27 ... 28 }
우리는이 클래스의 FactoryBean, InitializingBean 표시하고 만약 ApplicationListener 인터페이스, 콩 초기화가 특정 메소드를 구현하고 해당 인터페이스를 구현하는 것을 볼 수 있습니다, 여기에 수행 할 수 없습니다. 이제 중요한 것은 방법의 구현 보면, 이러한 방법과 무엇을 완료했다.
// 의 FactoryBean中的方法 공개 SqlSessionFactory는으로 getObject ()는 슬로우 {예외 경우 ( 이 .sqlSessionFactory == 널 ) { 이 .afterPropertiesSet (); } 반환 이 .sqlSessionFactory을; }
코드를 관찰함으로써, GetObject 메서드는 구성 SqlSessionFactory는 SqlSessionFactory는 빈 afterPropertiesSet가 buildSqlSessionFactory을 실행하는 경우, 접속과 운전을 구축, SqlSessionFactory는을 구축 할 것입니다 구성 파일을 구문 분석 MyBatis로, 최종 SqlSessionFactory는를 반환합니다. onApplicationEvent 뒤에 주로 모니터 응용 프로그램 이벤트 때 할 수있는 뭔가를 위해 (진행하지, 관심있는 학생들은 다음을 이해 갈 수 있습니다).
우리는 보이는 afterPropertiesSet 방법은 속성이 이동하도록 설정하는 방법입니다 걸릴 :
// InitializingBean 표시中的方法 공공 무효 afterPropertiesSet () 던져 예외 { Assert.notNull ( 이 .dataSource를, "재산권 '은 dataSource가'필요" ); Assert.notNull ( 이 .sqlSessionFactoryBuilder은 "속성 'SqlSessionFactoryBuilder를이'필요" ); Assert.state ( 이 .configuration == 널 (null) && 이 .configLocation == null의 || 이 .configuration == null의 || 이 .configLocation == 널 (null)"속성 '구성'과 'configLocation은'함께 지정 할 수 없습니다" ); //이 익숙한 빌드 방법을 참조 다음은이 .sqlSessionFactory을 = 다음은이 .buildSqlSessionFactory (); }
주요 방법 buildSqlSessionFactory은 다음과 같습니다 this.sqlSessionFactoryBuilder.build (구성) 여기에 수행 할 수 없습니다. 이 시점에, SqlSessionFactory는이 생성 된 최대,의는 sqlSessionTemplate을 만드는 과정을 간단히 살펴 보자 :
@Bean @ConditionalOnMissingBean 공공 SqlSessionTemplate sqlSessionTemplate (SqlSessionFactory는 SqlSessionFactory는가) { 반환 새 (SqlSessionFactory는, SqlSessionTemplate을 이 .properties.getExecutorType ()); }
로 트랙, 당신은 새로운 SqlSessionTemplate에게 같은 시간을 찾을 경우, 그것은 sqlSessionProxy를 만들고, 여기에 확장하지.
매퍼 스캔 및 프록시 클래스를 만듭니다 라인 (2)
인터페이스는 첫째, 프록시 클래스를 생성 호출을 기다리는 하나 다음 하나의 스캔되어야합니다. 우리가이 과정을 살펴 보자 :
- 사용 MapperScannerConfigurer
- 주사 () 검사 맵퍼
- setBeanClass
- 가져 오기 MapperFactoryBean
- MapperFactoryBean.getObject () 메소드
- configuration.getMapper
- getMapper
- 폴더 레지스트리
- knownMappers
- 궁극적으로 세트 MapperProxy의 결과로, 그들은 원래 매퍼 프록시입니다. MapperProxy 때, 실제 통화 실행, 메소드 호출의 InvocationHandler 인터페이스를 실현할.
참고 : 점 4의 경우, MapperFactoryBean
빈 공장, 봄의 용기에, 공장은 콩, 콩 식물 자체가 주입되지 않을 때 스프링이 다른 주입하는 특수 목적 콩, 콩 식물은, 그것은 빈으로 getObject 호출 방법.
MyBatis로 스프링 호출 프로세스
SqlSessionFactory는이 초기화가 완료된 후, 매퍼 검사 및 프록시 클래스 포스트는이 두 가지 전제 조건, 우리는 MyBatis로 스프링의 스트로크의 마지막 스트로크 이후 프로 시저를 호출 할 수 있습니다 생성됩니다.
-
다음 진료 비즈니스 코드, 데이터베이스, 매퍼하는 방법을 쿼리해야
- 호출 MapperProxy
- 만약 2.1 판단
- 2.2 다른 판단되는 경우
- 2.3 방법에 초점을 cachedMapperMethod
- 2.4 mapperMethod.execute 포커스 방법의 실제 실행에있어서
- SQL 문을 처리 포인트의 유형에 따라
- 경우 INSERT
- 경우 UPDATE
- 경우 삭제
- 경우 SELECT
- 사례 FLUSH
-
상황에 SELECT 예는, sqlSession.selectList을 수행합니다. 반출이 때입니다 프록시 클래스의 매퍼
-
sqlSessionTemplate.sqlSessionProxy.selectList
- SqlSessionInterceptor 호출
- 6.1 getSqlSession는 사용 SqlSessionFactory는이 , sqlSessionHolder 기술을 사용하여, 새로 생성하지 않는했다. 어떤 경우, SQLSESSION있을 것
- > queryFromDatabase - -> doQuery - 질의이어서 6.2 defaultSqlSession.selectList 포커스> 1. 2.의 prepareStatement 수행
- 6.3 closeSqlSession
우리는 방법은 인터페이스 만 수행 할 수 호출 MyBatis로 스프링 프레임, 실제 SQLSESSION 작성,에서 찾을 수 있습니다. 프로세스는 더 이상 설명을 참조 할 수 있습니다.
참고 자료
- https://segmentfault.com/a/1190000015165470
만든 사람 : 2019년 6월 8일 21시