배경
최근에 프로젝트가 시작될 예정이며 데이터 마이그레이션 프로그램을 개발해야합니다. 이 프로그램의 주요 기능은 한 데이터베이스의 데이터를 쿼리하고 일련의 처리 후 다른 데이터베이스로 가져 오는 것입니다. 편의성과 개발 속도를 고려합니다. 당연히, 나는 그것을 Spring 및 Mybatis와 통합 할 생각을했습니다. Mybatis의 자동 코드 생성을 사용하더라도 DAO 계층의 많은 개발을 절약 할 수 있습니다.
통합의 구덩이
이전 프로젝트 : 이전에 이런 종류의 비슷한 프로그램을 가지고 있었기 때문에 Spring 및 Mybatis 통합의 구성을 직접 사용하여 수정했습니다. 이전의 통합 구성은 다음과 같습니다.
1. 데이터베이스 URL 및 사용자 이름 및 비밀번호의 구성 가능성을 고려 하여이 정보를 속성 파일에 넣으십시오. 스프링 구성 파일에 사용됩니다
<컨텍스트 : Property-Placeholder Location = "ClassPath : config.properties" />
2. 스프링 구성 파일에서 MyBatis와 Spring의 통합 구성은 다음과 같습니다.
<bean id = "sqlsessionfactory"> <property name = "dataSource"ref = "dataSource" /> < /bean> <ean> <속성 이름 = "basePackage"value = "com.lagou.chat.record.transfer.dao" /> < /bean>
위 구성에는 문제가 없습니다. 따라서 구성을 새 프로젝트에 복사하십시오
현재 프로젝트 : 이전 프로젝트의 구성을 복사하지만 새 프로젝트는 두 개의 데이터베이스에 연결해야하므로 당연히 두 개의 데이터 소스 (레코드 및 IM)가 필요하므로 이전 구성이 다음과 같이 수정됩니다.
1. 속성 파일 사용 구성은 변경되지 않았습니다
2. 이전에는 데이터 소스가 하나만 있었기 때문에 (SQLSESSIONFACTORY) <속성 이름 = "SQLSESSIONFACTORY"ref = "SQLSESSIONFACTORY"/>은 MappersCannerConfigurer에서 구성되지 않았습니다. 기본 sqlsessionFactory가 사용되기 때문입니다. 그러나 이제는 두 가지 데이터 소스가 있으며,이를 지정하지 않으면 혼란을 일으킬 것입니다. 따라서 구성은 다음과 같이 수정됩니다
<bean id = "record_sqlsessionfactory"> <속성 이름 = "dataSource"ref = "record_datasource" /< /bean> <bean id = "config1"> <property name = "basepackage"value = "com.xxx.util.rollback.record.dao"/> /> < /bean> <bean id = "im_sqlsessionfactory"> <property name = "dataSource"ref = "im_datasource" /< /bean> <bean id = "config2"> <property name = "basePackage"value = "com.xxx.util.im.im.dao" /> <속성 이름 = "sqlsession actormory" ref = "im_sqlsessionfactory" /> < /bean>
그 결과 새 프로젝트를 실행할 때 스프링 구성 파일의 $ {jdbc.url}, $ {jdbc.name}과 같은 속성은 속성의 지정된 값으로 대체 할 수 없습니다. 처음에, 나는 자연스럽게 Spring과 Mybatis의 통합으로 인한 것으로 기대하지 않았으므로 Spring 구성 파일이 잘못되었는지 여부, 속성 파일이 잘못되었는지 여부, 속성 파일이 참조되지 않았는지 또는 속성 파일이 클래스 경로 디렉토리 등을 정리하지 않았는지에 대해 계속 분석하지 않았다면 문제의 원인을 분석하지 않으면 문제가 발생할 수는 없습니다. 나는 인터넷으로 돌아 가야했다. 마침내 답을 찾았습니다
고정 방법 : 구성을 다음으로 변경하면 문제가 해결되었습니다.
<bean id = "record_sqlsessionfactory"> <property name = "dataSource"ref = "record_datasource" /> < /bean> <bean id = "config1"> <property name = "basepackage"value = "com.xxx.util.rollback.record.dao"/> value = "record_sqlsessionfactory" /> < /bean> <bean id = "im_sqlsessionfactory"> <property name = "dataSource"ref = "im_datasource" /> < /bean> <bean id = "config2"> <property name = "basepackage"value = "com.xxx.util.rollback.im.m.dao" />>>. 이름 = "sqlsessionFactoryBeanName"value = "im_sqlsessionFactory"/> </bean>
SQLSESSIONFACTORY 속성을 SQLSESSIONFACTORYBEANNAME로 변경하는 것입니다. 물론 심판은 또한 가치로 변경되어야합니다. sqlSessionFactoryBeanName 속성은 문자열 유형이기 때문입니다
이유
Spring에 자동 스캔을 위해 org.mybatis.spring.spring.mapper.mapperscannerConfigurer를 사용하는 경우, sqlsessionfactory가 설정되면 PropertyPlaceHolderConfigurer가 유효하지 않을 수 있습니다. 즉, $ {jdbc.username}과 같은 표현은 속성 파일에서 내용을 얻을 수 없습니다.
MapperscannerConigurer가 실제로 구문 분석 Bean 정의 단계에 있기 때문입니다. 현재 SQLSessionFactory를 설정하면 일부 클래스가 사전에 초기화됩니다. 현재 PropertyPlaceHolderConfigurer는 정의의 변수를 교체 할 시간이 없었기 때문에 표현식이 문자열로 복사됩니다. 그러나 SQLSESSIONFACTORY 속성이 설정되지 않은 경우 스프링의 SessionFactory 이름이 SQLSessionFactory 여야하는지 확인해야합니다. 그렇지 않으면 자동으로 주입되지 않습니다.
위의 것은 <context : property-rolder>를 사용할 때 mybatis를 통합하는 봄의 함정입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!