arrière-plan
Récemment, le projet est sur le point d'être lancé et un programme de migration de données doit être développé. La fonction principale du programme est d'interroger les données dans une base de données et de les importer dans une autre base de données après une série de traitements. Considérant la commodité et la vitesse de développement. Naturellement, j'ai pensé à l'intégrer à Spring et Mybatis. Même l'utilisation de la génération automatique de code de MyBatis peut économiser beaucoup de développement de couches DAO.
Le fosse d'intégration
Projet précédent: J'ai déjà eu ce type de programme similaire, j'ai donc directement utilisé la configuration de l'intégration Spring et MyBatis pour la modifier. La configuration intégrée précédente est la suivante:
1. Compte tenu de la configurabilité de l'URL de la base de données et du nom d'utilisateur et du mot de passe, placez ces informations dans le fichier Properties. Utilisé dans le fichier de configuration Spring
<Context: propriété-placeholder location = "classpath: config.properties" />
2. La configuration intégrée de MyBatis et Spring dans le fichier de configuration de Spring est comme ceci
<bean id = "sqlSessionFactory"> <propriété name = "dataSource" ref = "dataSource" /> </-bean> <an bean> <propriété name = "basepackage" value = "com.lagou.chat.record.transfer.dao" /> </ank>
Il n'y a aucun problème avec la configuration ci-dessus. Alors copiez simplement la configuration dans le nouveau projet
Projet en cours: Copiez la configuration de l'ancien projet, mais le nouveau projet doit se connecter à deux bases de données, donc naturellement deux sources de données (enregistrement et IM) sont nécessaires, donc l'ancienne configuration est modifiée comme suit
1. La configuration de l'utilisation des fichiers de propriétés reste inchangée
2. Auparavant, car il n'y avait qu'une seule source de données (une SQLSessionFactory), le <propriété name = "sqlSessionFactory" ref = "SQLSessionFactory" /> n'a pas été configuré sous le MapperscannerConfigurer. Parce que le SQLSessionFactory par défaut est utilisé. Mais maintenant, il y a deux sources de données, et non les spécifier, cela entraînera certainement une confusion. Ainsi, la configuration est modifiée comme suit
<bean id = "disques_sqlSessionFactory"> <propriété name = "dataSource" ref = "dissal_datasource" /> </ bean> <bean id = "config1"> <propriété name = "basepackage" value = "com.xxx.util.rollback.record.dao" /> <propriété name = "sqlSessionfactory" ref = "record_sql /> </ bean> <bean id = "im_sqlSessionFactory"> <propriété name = "dataSource" ref = "im_datasource" /> </ bean> <bean id = "config2"> <propriété name = "basepackage" value = "com.xxx.util.rollback" Ref = "im_sqlSessionFactory" /> </bant>
Le résultat est que lors de l'exécution d'un nouveau projet, les propriétés telles que $ {jdbc.url}, $ {jdbc.name} dans le fichier de configuration de ressort ne peuvent pas être remplacées par les valeurs spécifiées dans les propriétés. Au début, je ne m'attendais pas naturellement à ce que ce soit à cause de l'intégration de Spring et Mybatis, donc j'ai continué à vérifier si le fichier de configuration de Spring était mauvais, si le fichier Properties était faux, si le fichier de propriétés n'était pas référencé ou si le fichier de propriétés n'était pas compilé dans le répertoire de ClassPath, etc. Bien sûr, si l'analyse n'analyse pas la cause du problème, il est naturellement impossible de trouver une solution pour la solution. J'ai dû me tourner vers Internet. Enfin trouvé la réponse
Méthode fixe: modifiez la configuration en ce qui suit, le problème a été résolu:
<bean id = "Record_sqlSessionFactory"> <propriété name = "dataSource" ref = "dissal_datasource" /> </ank> <bean id = "config1"> <propriété name = "basepackage" value = "com.xxx.util.rollback.record.dao" /> <propriété name = "sqlSessionfactorybanname" Value = "Record_sqlSessionFactory" /> </anEn> <bean id = "im_sqlSessionFactory"> <propriété name = "dataSource" Ref = "im_datasource" /> </ank> <any id = "config2"> <propriété name = "basepackage" value = "com.xxx.util.rollback.im.im.dao" name = "sqlSessionFactoryBeAnName" value = "im_sqlSessionFactory" /> </ank>
Il s'agit de modifier la propriété SQLSessionFactory en SQLSessionFactoryBeAnname. Bien sûr, la référence doit également être changée en valeur. Parce que la propriété SQLSessionFactoryBeanName est un type de chaîne
raison
Lorsque vous utilisez org.mybatis.spring.mapper.mapperscannerconfigurer pour la numérisation automatique au printemps, si le SQLSessionFactory est défini, le propriétéPlaceHolderconfigurer peut être invalide, c'est-à-dire que les expressions telles que $ {jdbc.Esername} ne seront pas en mesure d'obtenir le contenu dans le fichier de properties.
En effet Si vous définissez le SQLSessionFactory pour le moment, cela entraînera l'initialisation de certaines classes à l'avance. À l'heure actuelle, le PropertyPlaceHolderConfigurer n'a pas eu le temps de remplacer les variables dans la définition, ce qui entraîne l'expression copiée sous forme de chaîne. Cependant, si la propriété SQLSessionFactory n'est pas définie, il est nécessaire de s'assurer que le nom SessionFactory à Spring doit être SQLSessionFactory, sinon il ne sera pas automatiquement injecté.
Ce qui précède est les pièges du printemps intégrant MyBatis lors de l'utilisation de <Context: Property-placeholder> que je vous ai présenté. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!