Mybatis根據Spring配置文件實現寫不一樣的Sql語句

 1. 提問:怎麼讓一個接口經過不一樣的開發環境進行不一樣的sql操做?

全文用以區分的配置文件以spring.profiles.active爲例程序員

首先,mapper層用spring註解@Value讀取配置文件是不行的。編譯不會錯,可是經過註解寫入的值必然爲空。面試

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

2. 解決方案

把配置文件讀到靜態參數上面,而後Provider讀取靜態參數spring

2.1.何時纔是一個寫入靜態參數的好時機呢?

在main方法的SpringApplication.run()以後,正好合適。sql

細心的同窗可能發現了這個方法實際上是有返回值的,返回了一個ConfigurableApplicationContext類。數據庫

這個context指的即是sping上下文,進去查源碼,查看類描述編程

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

譯:由大多數(若是不是全部)應用程序上下文實現的SPl接口。除了Applicationcontext接口中的應用程序上下文客戶端方法外,還提供配置應用程序上下文的工具。這裏封裝了配置和生命週期方法,以免讓ApplicationContext客戶端代碼明顯看到它們。目前的方法應該只在啓動和關閉代碼中使用。設計模式

繼續從spring上下文裏找環境變量mybatis

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

譯:以可配置的形式返回此應用程序上下文的Environment,容許進一步定製。多線程

那麼咱們即可以從spring環境裏面取得想要的配置文件並寫入靜態變量了架構

2.2 開始編碼測試

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

那麼啓動程序看一下,是否得到到了

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

這時候又有同窗問了:「若是咱們的配置文件讀取了多個配置呢?這個string是否是就不乾淨啦?」

繼續細看這個類,這就是答案,把每一個激活的環境以集合的形式給你。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

繼續編碼測試,這樣就有更完善的方案來解決了。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3.剖析原理

3.1 代理與反射

spring註解的方式是在spring實現加強類的時候,把值注入進去的。那麼值爲空的狀況就能夠大膽猜想了: mybatis調用Provider類時用的是類本類,因此獲取不到值。

驗證時刻:「類和類不能一律而論」

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3.2 深追底層

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

能夠看到該類調用了.newInstance()方法

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

譯: 建立由class對象表示的類的新實例。類被實例化,就像經過帶有空參數列表的new表達式同樣。注意,該方法傳播由空構造函數拋出的任何異常,包括檢查的異常。使用此方法能夠有效地繞過編譯器執行的編譯時異常檢查。構造函數。newInstance方法經過將構造函數拋出的任何異常包裝在(checked)InvocationTargetException中來避免這個問題。

3.3 延展

看到了.newInstance()方法,至少可以肯定,在使用Mybatis的時候操做Provider的時候必需要一個public的空參構造器。

最後

對於程序員來講,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提高本身,歷來都是咱們去適應環境,而不是環境來適應咱們!

不用多說,相信你們都有一個共識:不管什麼行業,最牛逼的人確定是站在金字塔端的人。因此,想作一個牛逼的程序員,那麼就要讓本身站的更高,成爲技術大牛並非一朝一夕的事情,須要時間的沉澱和技術的積累。

如今競爭這麼激烈,只有經過不斷學習,提升本身,才能保持競爭力。

對於一些不知道學習什麼,沒有一個系統路線的程序員,這裏給你們提供一些學習資料

須要的小夥伴,能夠一鍵三連,點擊這裏獲取免費領取方式

《Java核心知識點合集(283頁)》

內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等 watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java中高級核心知識點合集(524頁)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java高級架構知識點整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Docker從入門到實踐》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《spring could 學習筆記》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《JVM與性能調優知識點整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《MySQL性能調優與架構設計解析文檔》305頁

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Nginx入門到實戰》319頁

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java併發編程》385頁

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《1000道 互聯網Java工程師面試題 (485頁)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

須要的小夥伴,能夠一鍵三連,點擊這裏獲取免費領取方式 

相關文章
相關標籤/搜索