程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring整合Mybatis應用<context:property-placeholder>時的坑

Spring整合Mybatis應用<context:property-placeholder>時的坑

編輯:關於JAVA

Spring整合Mybatis應用<context:property-placeholder>時的坑。本站提示廣大學習愛好者:(Spring整合Mybatis應用&lt;context:property-placeholder&gt;時的坑)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring整合Mybatis應用&lt;context:property-placeholder&gt;時的坑正文


配景

  比來項目要上線,須要開辟一個數據遷徙法式。法式的重要功效就是將一個數據庫裡的數據,查詢出來經由一系列處置後導入另外一個數據庫。斟酌到開辟的便利快捷。天然想到用spring和mybatis整合一下。乃至用mybatis的主動代碼生成,可以省下年夜量dao層的開辟。

整合的坑

之前的項目:之前也有過這類相似的法式,就把spring和mybatis整合的設置裝備擺設直接拿來修正下用。之前的整合設置裝備擺設是如許子的:

   1、斟酌到數據庫url、用戶名暗碼的可設置裝備擺設性,將這些信息放入properties文件。在spring設置裝備擺設文件裡應用了

  <context:property-placeholder location="classpath:config.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),所以沒有在MapperScannerConfigurer下設置裝備擺設<property name="sqlSessionFactory" ref="sqlSessionFactory"/>。由於默許應用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整合的緣由,所以一度赓續檢討spring設置裝備擺設文件能否有誤,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屬性改成sqlSessionFactoryBeanName。固然也得將ref改成value。由於sqlSessionFactoryBeanName屬性是字符串類型

緣由

  spring裡應用org.mybatis.spring.mapper.MapperScannerConfigurer 停止主動掃描的時刻,設置了sqlSessionFactory 的話,能夠會招致PropertyPlaceholderConfigurer掉效,也就是用${jdbc.username}如許之類的表達式,將沒法獲得到properties文件裡的內容。

  招致這一緣由是由於,MapperScannerConigurer現實是在解析加載bean界說階段的,這個時刻如果設置sqlSessionFactory的話,會招致提早初始化一些類,這個時刻,PropertyPlaceholderConfigurer還沒來得及調換界說中的變量,招致把表達式看成字符串復制了。 但假如不設置sqlSessionFactory 屬性的話,就必需要包管sessionFactory在spring中稱號必定如果sqlSessionFactory ,不然就沒法主動注入。

以上所述是小編給年夜家引見的Spring整合Mybatis應用<context:property-placeholder>時的坑 ,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved