fondo
Recientemente, el proyecto está a punto de ser lanzado y se debe desarrollar un programa de migración de datos. La función principal del programa es consultar los datos en una base de datos e importarlos a otra base de datos después de una serie de procesamiento. Considerando la conveniencia y la velocidad del desarrollo. Naturalmente, pensé en integrarlo con Spring y MyBatis. Incluso usar la generación de código automático de MyBatis puede ahorrar mucho desarrollo de capas DAO.
El pozo de la integración
Proyecto anterior: He tenido este tipo de programa similar antes, por lo que utilicé directamente la configuración de la integración Spring y MyBatis para modificarlo. La configuración integrada anterior es la siguiente:
1. Teniendo en cuenta la configurabilidad de la URL de la base de datos y el nombre de usuario y la contraseña, coloque esta información en el archivo de propiedades. Utilizado en el archivo de configuración de primavera
<context: Property-placeholder ubicación = "classpath: config.properties" />
2. La configuración integrada de MyBatis y Spring en el archivo de configuración de Spring es así
<bean id = "sqlsessionFactory"> <Property name = "dataSource" ref = "dataSource" /> < /bean> <Bean> <Property Name = "BasePackage" value = "com.lagou.chat.record.transfer.dao" /> </ bean>
No hay problema con la configuración anterior. Así que simplemente copie la configuración al nuevo proyecto
Proyecto actual: Copie la configuración del proyecto anterior, pero el nuevo proyecto debe conectarse a dos bases de datos, por lo que, por lo tanto, se necesitan dos fuentes de datos (registro e IM), por lo que la configuración anterior se modifica de la siguiente manera
1. La configuración del uso de archivos de propiedades permanece sin cambios
2. Anteriormente, debido a que solo había una fuente de datos (una SQLSessionFactory), el <propiedad de propiedad = "SQLSessionFactory" ref = "SQLSessionFactory"/> no estaba configurado en MappersCannerConfigurer. Porque se usa el SQLSessionFactory predeterminado. Pero ahora hay dos fuentes de datos, no especificarlas definitivamente conducirá a la confusión. Entonces la configuración se modifica de la siguiente manera
<bean id = "registro_sqlsessionfactory"> <propiedad name = "dataSource" ref = "registrado_dataSource" /> </a -bean id = "config1"> <propiedad name = "basepackage" valor = "com.xxx.util.rollback.record.dao" /> <name de propiedad = "sqlsession" ref = "récord =" récord "récord" récord " /></bean> <bean id="im_sqlSessionFactory"><property name="dataSource" ref="im_dataSource" /></bean><bean id="config2"><property name="basePackage" value="com.xxx.util.rollback.im.dao" /><property name="sqlSessionFactory" ref="im_sqlSessionFactory" /> < /bean>
El resultado es que al ejecutar un nuevo proyecto, las propiedades como $ {jdbc.url}, $ {jdbc.name} en el archivo de configuración de resorte no pueden ser reemplazadas por los valores especificados en las propiedades. Al principio, naturalmente no esperaba que se debiera a la integración de Spring y MyBatis, por lo que seguía verificando si el archivo de configuración de Spring era incorrecto, si el archivo de propiedades era incorrecto, si el archivo de propiedades no se hace referencia o el archivo de propiedades no se compiló en el directorio de clases, etc., por supuesto, si el análisis no analiza la causa del problema, es naturalmente imposible de encontrar una solución al problema. Tuve que recurrir a Internet. Finalmente encontré la respuesta
Método fijo: cambie la configuración a lo siguiente, el problema se resolvió:
<bean id = "registro_sqlsessionfactory"> <propiedad name = "dataSource" ref = "registrado_dataSource" /> </a -bean id = "config1"> <propiedad name = "basepackage" valor = "com.xxx.util.rollback.record.dao" /> <name de propiedad = "sqlsession" valle_seStyseStion " /></bean> <bean id="im_sqlSessionFactory"><property name="dataSource" ref="im_dataSource" /></bean><bean id="config2"><property name="basePackage" value="com.xxx.util.rollback.im.dao" /><property name="sqlSessionFactoryBeanName" value = "im_sqlsessionFactory"/> </bean>
Es cambiar la propiedad SQLSessionFactory a SQLSessionFactoryBeanName. Por supuesto, el Ref también debe cambiarse al valor. Porque la propiedad SQLSessionFactoryBeanName es un tipo de cadena
razón
Cuando se usa org.mybatis.spring.mapper.mappersCannerConfigurer para el escaneo automático en la primavera, si se establece SQLSessionFactory, el PropertyPlaceHoldERConfigurer puede ser inválido, es decir, expresiones como $ {jdbc.usEname} no podrán obtener el contenido en el archivo de propiedades.
Esto se debe a que el MappersCannerConiger está realmente en la etapa de definición de frijol de carga de análisis. Si establece SQLSessionFactory en este momento, hará que algunas clases se inicialicen por adelantado. En este momento, el PropertyPlaceHolderConfigurer no ha tenido tiempo de reemplazar las variables en la definición, lo que resulta en que la expresión se copie como una cadena. Sin embargo, si la propiedad SQLSessionFactory no está establecida, es necesario asegurarse de que el nombre de SessionFactory en primavera sea SQLSessionFactory, de lo contrario no se inyectará automáticamente.
Lo anterior son las trampas de la primavera que integran mybatis cuando se usan <context: Property-placeholder> que le he presentado. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!