




PropertyTokenizer類
這個類是property包中的重量級類,該類會被reflection包中其他的類頻繁的引用到。這個類實現了Iterable和Iterator這兩個接口,但在使用時經常被用到的是Iterator接口中的hasNext這個函數。我們着重了解這個類的屬性和構造函數:
//包含四個屬性,比較簡單 private String name; private String index; private String indexedName; private String children; public PropertyTokenizer(String propertyName) { // 對參數進行第一次處理,通過“.”分隔符將propertyName分作兩部分 int delimiter = propertyName.indexOf("."); if (delimiter > -1) { name = propertyName.substring(0, delimiter); children = propertyName.substring(delimiter + 1); } else { name = propertyName; children = null; } indexedName = name; // 對name進行二次處理,去除“[...]”,並將方括號內的內容賦給index屬性,如果name屬性中包含“[]”的話 delimiter = propertyName.indexOf("["); if (delimiter > -1) { // 先取index內容再截取name更為方便些,要不然還需要一個臨時變量,需要三步才能實現 // 這里包含了一個前提:傳入的參數如果有有[,則必然存在],並且是屬性的最后一個字符 index = name.substring(delimiter + 1, name.length() - 1); name = name.substring(0, delimiter); } }
經常使用的hasNext函數實現比較簡單,就是判斷children屬性是不是為空:
public boolean hasNext() { // TODO Auto-generated method stub return children != null; }
Mybatis 之mapUnderscoreToCamelCase
之前用spring jdbc的時候發下spring可以駝峰轉換,所以一直希望mybatis也有,之前還以為mybatis這個是個bug,后來發現原來也是有的,用起來也是很簡單的,在setting設置下就可以了,這里就不說了,下面說下是怎么實現的
如果我們設置了,useCamelCaseMapping=ture,那么mybatis就把_給干掉了,看到這里我也很疑惑,還以為是坑爹呢,
我們接着往下看,buildProperty
其實是從reflector獲取的數據,做個reflector是干嘛的呢,其實就是mybatis來存儲class信息的,也可以說是mybatis的反射工具類
從Reflector里面
public StringfindPropertyName(String name) {
returncaseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH));
}
做個toUpperCase是個關鍵,他忽略了我們類里面的屬性值,也就是說我們一個id和一個ID屬性,對於mybatis來說可能是一直的呦
而private Map<String, String>caseInsensitivePropertyMap = new HashMap<String, String>();
存儲的就是field 的upperCaseName和真實的Name 也就是我們的駝峰轉換,或者其實不對稱的駝峰也是可以的,只要把_去掉,應該就可以拿到的
再把整個流程整理一下:
所以其實不是轉換下划線,而是去掉下划線,再取駝峰的變量。不過最后的效果與轉換的一樣。
Mybatis 之mapUnderscoreToCamelCase
之前用spring jdbc的時候發下spring可以駝峰轉換,所以一直希望mybatis也有,之前還以為mybatis這個是個bug,后來發現原來也是有的,用起來也是很簡單的,在setting設置下就可以了,這里就不說了,下面說下是怎么實現的
如果我們設置了,useCamelCaseMapping=ture,那么mybatis就把_給干掉了,看到這里我也很疑惑,還以為是坑爹呢,
我們接着往下看,buildProperty
其實是從reflector獲取的數據,做個reflector是干嘛的呢,其實就是mybatis來存儲class信息的,也可以說是mybatis的反射工具類
從Reflector里面
public StringfindPropertyName(String name) {
returncaseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH));
}
做個toUpperCase是個關鍵,他忽略了我們類里面的屬性值,也就是說我們一個id和一個ID屬性,對於mybatis來說可能是一直的呦
而private Map<String, String>caseInsensitivePropertyMap = new HashMap<String, String>();
存儲的就是field 的upperCaseName和真實的Name 也就是我們的駝峰轉換,或者其實不對稱的駝峰也是可以的,只要把_去掉,應該就可以拿到的