在实际的开发中,建数据库表的有可能会因为最初的表设计不能满足所用,为了标记某种状态需要重新增加字段,但是数据库中如果有几百万条真实的数据,往往改变表结构是很危险的操作
有没有办法用一个字段表示多个状态,但是每个状态不会互相干扰呢?
此时我们可以用到位操作
如果是表示删除可以用1,未删除用0(第一位)
如果是表示上架可以用1,未上架用0(第二位)
如果是表示默认可以用1,非默认用0(第三位)
…
把这些状态整合起来就是000,001,010…
这时候我们只需要判断第一位是1还是0就知道是不是删除状态了,如删除状态:0 0 1,0 1 1,1 0 1,1 1 1。不管其他位是什么都不会干扰到删除位
在数据库中我用int flag
字段表示多个状态
上代码:
public class test {
private static int shiftFlag(Boolean isWhat, int bit, int flag){
if(isWhat){
/**
* 如果是某状态,如:
* 是删除状态,删除位是 bit = 001,在或操作下,一定是会让当前位 置1
*/
flag |= bit;
}else {
/**
* 如果是非某状态,如:
* 非删除状态,删除位是 bit = 001,~会把1变成0,0变成1,所以~bit = 110,
* 在与操作下,一定会让当前位 置0
*/
flag &= ~bit;
}
return flag;
}
public static void main(String[] args) throws Exception {
int flag = 0;
final int DELETE = 0x1; //001 代表删除
final int ON_SHELF = 0x2; //010 代表上架
final int DEFAULT = 0x4; //100 代表默认
Boolean is_delete = true;
flag = shiftFlag(is_delete, DELETE, flag);
System.out.print("代表删除的flag:");
System.out.println(Integer.toBinaryString(flag)); //001
Boolean isOnShelf = true;
flag = shiftFlag(isOnShelf, ON_SHELF, flag);
System.out.print("代表上架的flag:");
System.out.println(Integer.toBinaryString(flag)); //011
Boolean isDefault = true;
flag = shiftFlag(isDefault, DEFAULT, flag);
System.out.print("代表默认的flag:");
System.out.println(Integer.toBinaryString(flag)); //111
//此时flag是111,如果此时不是删除
flag = shiftFlag(!is_delete, DELETE, flag);
System.out.print("代表非删除的flag:");
System.out.println(Integer.toBinaryString(flag)); //110
//此时flag是110,如果此时非默认
flag = shiftFlag(!isDefault, DEFAULT, flag);
System.out.print("代表非默认的flag:");
System.out.println(Integer.toBinaryString(flag)); //010
}
}
运行结果
代表删除的flag:1
代表上架的flag:11
代表默认的flag:111
代表非删除的flag:110
代表非默认的flag:10
如果多个状态用1和0表示不了呢
如果要增加的字段是String类型的,比如增加了name字段
此时在建表的时候要预留一个text content
来存字符串
Map<String, Object> map = new HashMap<String, Object>();
map.put("sex", "女");
map.put("age", "18");
map.put("name", "妞妞");
String s = JSONObject.toJSONString(map);
//这个就是要存在content里面的字符串
//{"sex":"女","name":"妞妞","age":"18"}
System.out.println(s);
//要用的时候取出来转回map
map = JSONObject.parseObject(s, Map.class);
问题解决,收工