我目前对我的工作数据库有疑问。
他们使用基于0和1的字符串来表示它是否处于活动状态。但是根据我的逻辑,我想使用true或false。
为什么?因为有多余的代码。例如:
if(foo.getStateClient().equals("1"))
//Do things...
想象一下,还有6或7个字段。
无法修改数据库。而且我不知道是否像前面的示例一样使用字符串,还是做任何将字符串转换为布尔值的事情。
而且,状态始终为0或1
我感谢任何建议都可以达到最佳效果
编辑1我不是在问怎么做,我是在问这样做的最佳实践。
我将Spring与Hibernate结合使用,有人问我正在使用什么ORM。
您可以在实体中为属性使用Boolean
类型,并使用AttributeConverter
处理实体中Boolean
和数据库中String/varchar
之间的转换。
@Converter
public class BooleanConverter implements AttributeConverter<Boolean, String> {
@Override
public Character convertToDatabaseColumn(Boolean value) {
if (value != null) {
if (value) {
return '1';
} else {
return '0';
}
}
return null;
}
@Override
public Boolean convertToEntityAttribute(String value) {
if (value != null) {
return !value.equals('0');
}
return null;
}
}
实体:
@Convert(converter = BooleanConverter.class)
private boolean status;
在数据库中,TINYINT
0/1可以立即成为Java端的boolean
。因此,将字段设置为布尔值(有时可能是布尔值),然后尝试是否有效。
以这种方式,可以将所有准布尔字段逐步重构为实字段。
如果字段改为CHAR(1)
,您仍然可能会成功,可能需要在Java实体端使用某些转换器。
通过这种方式,您的数据模型是干净的,并且没有人为的样板代码。
只需创建一个可用于此类事物的辅助方法
即
public class BooleanHelper {
public static boolean fromString(String value) {
if (value == null) {
return false;
}
if ("1".equals(value) || "true".equalsIgnoreCase(value)) {
return true;
}
return false;
}
}
以这种方式,您可以在任何需要的地方使用它
if(BooleanHelper.fromString(foo.getStateClient()))
//Do things...
您也可以静态导入该方法,以减少样本量
编辑:使用Spring和Hibernate表示OP
正如您所指出的,您正在使用Spring和Hibernate,可以为此创建AttributeConverter
public class BooleanAttributeConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean value) {
if (value == null) {
return "0";
}
return value ? "1" : "0";
}
@Override
public Boolean convertToEntityAttribute(String value) {
if (value == null) {
return false;
}
if ("1".equals(value) || "true".equalsIgnoreCase(value)) {
return true;
}
return false;
}
}
然后在您的实体上指定此内容
@Entity
public class Foo {
@Column
@Convert(converter = BooleanAttributeConverter.class)
private boolean stateClient;
public boolean isStateClient() {
return stateClient;
}
public void setStateClient(boolean stateClient) {
this.stateClient = stateClient;
}
}