具體問題
最近在做項(xiàng)目時數(shù)據(jù)庫有用的postgresql,用到了它的范圍類型,用mybatis做的數(shù)據(jù)庫操作。
postgresql提供了下圖幾種內(nèi)置類型和自定義類型:
| 類型 | 值范圍 |
|---|---|
| int4range | 單元格 |
| int8range | bigint的范圍 |
| numrange | numeric的范圍 |
| tsrange | 不帶時區(qū)的timestamp的范圍 |
| tstzrange | 帶時區(qū)的timestamp的范圍 |
| daterange | date的范圍 |
在用mybatis對數(shù)據(jù)庫表和java對象做映射的時候沒有合適的java類型
解決方案
方案一
項(xiàng)目中用到的是int4range,java類型設(shè)置為ArrayList<Integer>在做數(shù)據(jù)插入、修改或者查詢時改格式為[int,int]::int4range類型的字符串
- 優(yōu)點(diǎn):處理簡單
- 缺點(diǎn):不能完全應(yīng)用mybatis的對象映射,總要多傳一個參數(shù);參數(shù)檢驗(yàn)很麻煩
方案二
時間類型我計(jì)劃用數(shù)值類型的時間戳來處理
java類型我定義了一個類
@Data
public class RangeCode<T extends Number> {
private T min_value;
private T max_value;
public TreeSet<T> treeSet = new TreeSet<>();
public RangeCode(T min_value, T max_value) {
if (min_value == null || max_value == null){
throw new NullPointerException();
}
this.min_value = min_value;
this.max_value = max_value;
this.treeSet.add(min_value);
this.treeSet.add(max_value);
}
}
再針對RangeCode類型寫一個TypeHandler
- 優(yōu)點(diǎn):參數(shù)校驗(yàn)簡單,映射簡單
- 缺點(diǎn):treeMap這個數(shù)據(jù)結(jié)構(gòu)太重