具体问题
最近在做项目时数据库有用的postgresql,用到了它的范围类型,用mybatis做的数据库操作。
postgresql提供了下图几种内置类型和自定义类型:
类型 | 值范围 |
---|---|
int4range | 单元格 |
int8range | bigint的范围 |
numrange | numeric的范围 |
tsrange | 不带时区的timestamp的范围 |
tstzrange | 带时区的timestamp的范围 |
daterange | date的范围 |
在用mybatis对数据库表和java对象做映射的时候没有合适的java类型
解决方案
方案一
项目中用到的是int4range,java类型设置为ArrayList<Integer>
在做数据插入、修改或者查询时改格式为[int,int]::int4range
类型的字符串
- 优点:处理简单
- 缺点:不能完全应用mybatis的对象映射,总要多传一个参数;参数检验很麻烦
方案二
时间类型我计划用数值类型的时间戳来处理
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
- 优点:参数校验简单,映射简单
- 缺点:treeMap这个数据结构太重