以前的項(xiàng)目經(jīng)歷中,基本上都是spring + hibernate + Spring JDBC這種組合用的多。至于MyBatis,也就這個(gè)項(xiàng)目才開(kāi)始試用,閑話(huà)不多說(shuō),進(jìn)入正題。
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到虞城網(wǎng)站設(shè)計(jì)與虞城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋虞城地區(qū)。以前的這種框架組合中,動(dòng)態(tài)數(shù)據(jù)源切換可謂已經(jīng)非常成熟了,網(wǎng)上也有非常多的博客介紹,都是繼承AbstractRoutingDataSource,重寫(xiě)determineCurrentLookupKey()方法。具體做法就不在此廢話(huà)了。
所以當(dāng)項(xiàng)目中碰到這個(gè)問(wèn)題,我?guī)缀跸攵紱](méi)有想,就采用了這種做法,但是一測(cè)試,一點(diǎn)反應(yīng)都沒(méi)有。當(dāng)時(shí)覺(jué)得不可能,于是斷點(diǎn),加log調(diào)試,發(fā)現(xiàn)determineCurrentLookupKey()根本沒(méi)有調(diào)用。
為什么列? 這不可能啊。靜下心來(lái),仔細(xì)想想,才想到一個(gè)關(guān)鍵的問(wèn)題: Mybatis整合Spring,而不是Spring整合的Mybatis! 直覺(jué)告訴我,問(wèn)題就出在這里。
于是花時(shí)間去研究一下mybatis-spring.jar 這個(gè)包,發(fā)現(xiàn)有SqlSession這東西,很本能的就注意到了這一塊,然后大致看一下他的一些實(shí)現(xiàn)類(lèi)。于是就發(fā)現(xiàn)了他的實(shí)現(xiàn)類(lèi)里面有一個(gè)內(nèi)部類(lèi)SqlSessionInterceptor(研究過(guò)程就不多說(shuō)了,畢竟是個(gè)痛苦的過(guò)程)
好吧,這個(gè)類(lèi)的作用列,就是產(chǎn)生sessionProxy。關(guān)鍵代碼如下
final SqlSession sqlSession = getSqlSession( SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);