原创 利用AOP和AbstractRoutingDataSource實現動態切換數據源

背景: 公司有多套環境,每個環境執行數據庫腳本的時機也不一樣,久而久之,不同環境相同表的結構就有了差異,需要做一個工具進行對比。 分析: 同一套環境下有很多數據庫,不同環境的數據庫連接肯定也是不一樣的,那麼如何做到查詢指定環境下的

原创 Guava 之 Multiset

Multiset 是 guava 包下一種新的集合,可以方便的統計集合中重複元素出現的次數。 Multiset 有以下實現類: HashMultiset::元素存放於 HashMap LinkedHashMap:即元素的排列順序

原创 base64編碼與文件之間相互轉換

在數據傳輸過程中經常會遇到將文件轉爲base64編碼然後再進行傳輸,接收方接收到編碼數據後,需要進行解碼,獲取到文件。 JDK 1.8 以後,util 包下自帶 Base64 相關工具類,直接拿來使用能很快的解決我們的問題。

原创 Java實現壓縮文件和解壓文件

JAVA 實現將文件或文件夾壓縮成 zip,讀取 zip 包下的文件。 該工具類功能: 支持壓縮單個文件也支持壓縮整個文件夾 支持壓縮多級目錄結構的文件夾 支持壓縮空的文件夾 支持讀取zip壓縮包下的文件,包括多級目錄結構的文件

原创 AbstractRoutingDataSource 動態切換數據源

在項目中,有時候需要配置多數據源,在不同的場景下需要查詢不同的數據庫來滿足業務需求。在傳統的Spring + Mybatis 項目中,配置一個數據源如下: <!-- 配置數據源 --> <bean id="dataSou

原创 Guava 之 Multimap

Multimap 是 guava 包下的一個接口,是一個 (key, collection) 類型的集合. Multimap 接口方法: @GwtCompatible public interface Multimap<K, V> {

原创 Shell 腳本出現 $'\r': command not found

背景介紹: 在服務器部署jar包,以前都是在Windows打包然後上傳到服務器,再通過命令 java -jar xxx.jar 部署,感覺很繁瑣,所以就寫了個腳本,自動 pull 遠程倉庫代碼,然後打包,部署。 出現問題: 先

原创 裝飾模式

概述 裝飾模式可以在不改變一個對象本身功能的基礎上給對象增加額外的新行爲,在現實生活 中,這種情況也到處存在,例如一張照片,我們可以不改變照片本身,給它增加一個相框, 使得它具有防潮的功能,而且用戶可以根據需要給它增加不同類型的相

原创 組合模式

概述 對於樹形結構,當容器對象(如文件夾)的某一個方法被調用時,將遍歷整個樹形結構,尋找也包含這個方法的成員對象(可以是容器對象,也可以是葉子對象)並調用執行,牽一而動百,其中使用了遞歸調用的機制來對整個結構進行處理。由於容器對象

原创 橋接模式

在正式介紹之前,先看看下面這個列子。兩種常見文具的區別,它們是毛筆和蠟筆。假如 我們需要大中小3種型號的畫筆,能夠繪製12種不同的顏色,如果使用蠟筆,需要準備3×12 = 36支,但如果使用毛筆的話,只需要提供3種型號的毛筆,外加

原创 適配器模式

適配器模式: 將一個接口轉換成客戶希望的另一個接口,使接口不兼容的那些類可以一起工作,其別名包裝器(Wrapper)。適配器模式,既可以作爲類結構型模式,也可以作爲對象結構型模式。 在適配器模式中,我們通過增加一個新的適配器類來解