美文网首页
使用二进制的方式存储多条件的业务

使用二进制的方式存储多条件的业务

作者: 输入昵称就行 | 来源:发表于2020-09-11 16:11 被阅读0次

在业务开发中,有的时候会碰到这样的需求,一个对象要生效,会有各种各样的条件,而这些条件又只有之分,如果我们每个条件都用一个字段的话,那么数据库保存的时候需要对应给每个条件都加一个字段,这样也不是不可以,一般这种也是比较常见的做法,但是如果比较多,但是又有拓展的可能,那么是否可以考虑另一种方式来存储,也值得考虑。

本文介绍一种基于二进制的方式来存储这些条件,通过简单的java代码实现主要的逻辑。

开始

假如业务是支持的支付方式,比如有微信、支付宝、美团支付、抖音支付(听说要出了)、招商银行卡;

创建一个枚举:

public enum PayWayEnum {

    /**
     * 微信
     */
    TENCENT(0),
    /**
     * 支付宝
     */
    ALIPAY(1),

    /**
     * 抖音
     */
    BYTE_DANCE(2),

    /**
     * 美团
     */
    MEITUAN(3),

    /**
     * 招商银行
     */
    CMB(4),
    ;

    /**
     * 对应数据库存储的二进制位数
     */
    private int bit;

    PayWayEnum(int bit) {
        this.bit = bit;
    }

    public int getBit() {
        return bit;
    }

}

从业务的角度来讲,不外乎对这个字段的增改查

工具类

@UtilityClass
public class BinaryUtil {

    /**
     * 验证二进制第bit位的结果
     *
     * @param binary 二进制值
     * @param bit    index 从0开始
     * @return true 为1 false 为0
     */
    public static boolean match(Integer binary, int bit) {
        int value = 1 << (bit);
        int i = value & binary;
        return i > 0;
    }

    /**
     *
     * 将二进制result的第bit位设置为bool的值
     * 一般用于修改
     * @param binary 二进制原始值
     * @param bit    index 从0开始
     * @param bool   要设置的值
     * @return 修改后的结果
     */
    public static Integer set(Integer binary, int bit, boolean bool) {
        if (bool) {
            int value = 1 << bit;
            return binary | value;
        } else {
            int value = ~(1 << bit);
            return binary & value;
        }
    }

    /**
     * 指定几位生产二进制
     * 用户创建
     * @param bits  设置某几位为1
     * @return 范围生成的二进制值
     */
    public static Integer accept(int[] bits) {
        int binary = 0;
        for (int bit : bits) {
            binary = set(binary, bit, true);
        }
        return binary;
    }

    /**
     * 字符串二进制1010101转为整数值
     *
     * @param binaryString
     * @return
     */
    public static Integer valueOf(String binaryString) {
        return Integer.valueOf(binaryString, 2);
    }

    /**
     * 将数字转为二进制字符串
     *
     * @param integer
     * @return
     */
    public static String toBinaryString(Integer integer) {
        return Integer.toBinaryString(integer);
    }
}

测试

    public static void main(String[] args) {

        // 初始化
        Integer accept = accept(new int[]{PayWayEnum.TENCENT.getBit(), PayWayEnum.ALIPAY.getBit()});
        System.out.println(toBinaryString(accept));

        // 验证是否支持微信支付
        String value = toBinaryString(accept);
        Integer integer = valueOf(value);
        boolean match = match(integer, PayWayEnum.TENCENT.getBit());
        System.out.println(match);

        // 设置支持美团支付
        Integer result = set(integer, PayWayEnum.MEITUAN.getBit(), true);
        System.out.println(result);
        String s = Integer.toBinaryString(result);
        System.out.println(s);
    }

思考

使用二进制的方式存储类似的这种业务数据,扩展性比较强,比如我需要再增加一个建行支付,直接增加一个枚举即可(如果将枚举改成字典那就更好了); 但是也有不好的地方,比如数据库值可读性不高,不方便使用sql批量更新数据,因为每个的值都会有不同,比如我某天增加了一个支付方式,我希望所有的商品都支持这种支付方式,这个时候其实就需要精细化更新了。

总的来说这是一种思考的方向,具体还是要根据实际开发中的需要来使用不同的数据结构,没有万能药。

相关文章

  • 使用二进制的方式存储多条件的业务

    在业务开发中,有的时候会碰到这样的需求,一个对象要生效,会有各种各样的条件,而这些条件又只有是与否之分,如果我们每...

  • android sqlite添加图片到数据库

    sqlite图片是怎么储存的呢?其实是二进制的方式存储的blob代表使用二进制储存 (更多类型参考:数据库简介) ...

  • MongoDB-基础篇章

    1.NoSQL和MongoDB简介 文档是以二进制格JSON(BSON)对象的方式存储的,使用集合将数据编组,相当...

  • Python文件操作,看这篇就足够!

    文件的存储方式 在计算机中,文件是以二进制的方式保存在磁盘上的文本文件和二进制文件 文本文件可以使用文本编辑软件查...

  • 存储

    i# 存储 c语言存储主要分两种方式:文本文件,二进制。 二进制:视频,mp3,程序 记事本 存储步骤 (1)打开...

  • JAVA中数据存储方式以及单位转换

    一,数据的存储方式 数据是以二进制保存在内存中的,正数的在内存中的保存方式就是二进制。比如100的二进制值为011...

  • RMAN备份还原专题(持续更新)

    原理 : :存储数据库本身的信息(如数据字典信息,cdb和pdb分别),以及存储业务数据 :二进制的小文件,记录数...

  • 终于解惑随处可见的乱码

    计算机如何存储数据 计算机只能识别二进制,故只能使用二进制存储数据。 由于二进制可以与目前主流的十进制进行相互转换...

  • 文件相关库和函数

    字符理解需要文本打开,使用存储形态,用二进制打开。

  • SharedPreferences存储数据

    Android的存储方式 使用SharedPreferences存储数据文件存储数据SQLite数据库存储数据使用...

网友评论

      本文标题:使用二进制的方式存储多条件的业务

      本文链接:https://www.haomeiwen.com/subject/zqhbektx.html