Spring 통합 Mybatis 사용 시 구덩이

4860 단어 spring통합mybatis
배경
최근 프로젝트가 출시되려면 데이터 이전 프로그램을 개발해야 한다.프로그램의 주요 기능은 한 데이터베이스에 있는 데이터를 조회하여 일련의 처리를 거쳐 다른 데이터베이스로 가져오는 것이다.개발의 편리함을 고려하여 빠르다.자연스럽게spring과 mybatis로 통합할 생각입니다.심지어 mybatis의 자동 코드로 생성하면 대량의dao층 개발을 절약할 수 있다.
통합된 구덩이
이전 프로젝트: 이전에도 이런 유사한 프로그램이 있었는데spring과 mybatis가 통합된 설정을 직접 수정해서 사용했습니다.이전의 통합 구성은 다음과 같습니다.
1. 데이터베이스 URL, 사용자 이름 비밀번호의 설정 가능성을 고려하여 이 정보를properties 파일에 넣는다.스프링 프로필에서 사용했습니다.
  
2,spring 프로필에 있는 mybatis와spring의 통합 설정은 이렇다

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lagou.chat.record.transfer.dao" />
</bean> 
이상의 설정은 문제없습니다.그래서 구성을 새 프로젝트로 직접 복사합니다.
현재 프로젝트: 오래된 프로젝트의 설정을 복사하지만 새로운 프로젝트는 두 개의 데이터베이스에 연결하려면 두 개의 데이터 원본(record와im)이 필요합니다. 오래된 설정에 대해 다음과 같이 수정했습니다.
1,properties 파일을 사용하는 설정은 변하지 않습니다
2. 이전에 하나의 데이터 원본(sqlSessionFactory)이 있기 때문에 Mapper ScannerConfigurer에서 를 설정하지 않았습니다.기본적으로 sqlSessionFactory를 사용하기 때문입니다.그러나 현재 두 개의 데이터 원본이 있기 때문에 지정하지 않으면 틀림없이 혼란을 초래할 것이다.그래서 설정은 다음과 같이 수정되었습니다.

<bean id="record_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="record_dataSource" />
</bean>
<bean id="config1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxx.util.rollback.record.dao" />
<property name="sqlSessionFactory" ref="record_sqlSessionFactory"/>
</bean> 
<bean id="im_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="im_dataSource" />
</bean>
<bean id="config2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxx.util.rollback.im.dao" />
<property name="sqlSessionFactory" ref="im_sqlSessionFactory"/>
</bean> 
결과적으로 새 프로젝트를 실행할 때spring 프로필의 ${jdbc.url}, ${jdbc.name} 등 속성은properties에서 지정한 값으로 바꿀 수 없습니다.처음에는spring과 mybatis가 통합되었기 때문에 스프링 프로필이 틀렸는지,properties 파일이 틀렸는지,properties 파일이 인용되지 않았거나properties 파일이classpath 디렉터리에 컴파일되지 않았는지 등을 끊임없이 검사했습니다.물론 문제의 원인을 분석하지 못하면 자연히 문제를 해결할 방법을 찾을 수 없다.인터넷에 도움을 청할 수밖에 없다.결국 답을 찾았어요.
수정 방법: 구성을 다음과 같이 변경하면 문제가 해결됩니다.

<bean id="record_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="record_dataSource" />
</bean>
<bean id="config1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxx.util.rollback.record.dao" />
<property name="sqlSessionFactoryBeanName" value="record_sqlSessionFactory"/>
</bean> 
<bean id="im_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="im_dataSource" />
</bean>
<bean id="config2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxx.util.rollback.im.dao" />
<property name="sqlSessionFactoryBeanName" value="im_sqlSessionFactory"/>
</bean> 
sqlSessionFactory 속성을 sqlSessionFactory BeanName으로 바꾸는 것입니다.물론 ref를value로 바꿔야 합니다.sqlSessionFactoryBeanName 속성이 문자열 형식이기 때문에
원인
spring에서 org를 사용합니다.mybatis.spring.mapper.Mapper Scanner Configurer가 자동 스캔을 할 때 sql Session Factory를 설정하면 Property Placeholder Configurer가 효력을 잃을 수 있습니다. 즉, ${jdbc.username} 같은 표현식으로properties 파일에 있는 내용을 얻을 수 없습니다.
이 때문에 Mapper Scanner Conigurer는 실제적으로 bean 정의를 불러오는 단계를 해석하고 있습니다. 이때 sql Session Factory를 설정하면 클래스를 미리 초기화할 수 있습니다. 이때 Property Placeholder Configurer는 정의된 변수를 교체하지 못해 표현식을 문자열로 복사했습니다.그러나 sqlSessionFactory 속성을 설정하지 않으면sessionFactory가spring에서 이름이 반드시 sqlSessionFactory가 되어야 합니다. 그렇지 않으면 자동으로 주입할 수 없습니다.
위에서 말한 것은 편집자가 여러분께 소개한 Spring 통합 Mybatis가 를 사용할 때의 구덩이입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기