checkbox多选时,数据库保存结果的新思路

本文记录了一种不常见的数据库存储Checkbox数据的方法,通过将选项转换为二进制并进行异或操作,最后以二进制形式存储。虽然转换过程复杂,但适用于特定场景。这种方法可能对专业用户更适用,但对于一般用户,直接存储和显示选项标识可能更为直观。
摘要由CSDN通过智能技术生成

开发时遇到个需要存储checkbox 数据,目前选项最多包含11个可选。如果是我之前的思路,就直接在MySQL里面存上所选中的数据标识,以“,”分隔即可。
今天项目经理说了一个新思路,虽然我觉得并不怎么合适,但是当前项目上使用了,在此记录一下。

思路

前端仍然返回选项对应标识,即“1”,“2”,“3”……

  1. 对应标识数字存储转换为二进制的表达形式α,但非转换为二进制
    即:
    “1”→“0000000001”,
    “2”→“0000000010”,
    “3”→“0000000100”,
    “4”→“0000001000”,
    “5”→“0000010000”,
    “6”→“0000100000”,
    “7”→“0001000000”,
    “8”→“0010000000”,
    “9”→“0100000000”
  2. 二进制表达式转为十进制β
    即:
    “0000000001”→“1”,
    “0000000010”→“2”,
    “0000000100”→“4”,
    “0000001000”→“8”,
    “0000010000”→“16”,
    “0000100000”→“32”,
    “0001000000”→“64”,
    “0010000000”→“128”,
    “0100000000”→“256”
  3. 当用户选择某项时,前端出来“1”,“5”,“6”等具体选项时,遍历这些选项,取选项数字对应的β数据取异或。
    例:
    0^1 → 1
    1^5 → 17
    17^6 → 49
  4. 最终结果转换为二进制(这次真的是十进制转二进制)
    49 → 110001

把最终110001保存到数据库中。当前项目在返回时也直接返回110001给前端页面。用户直接看110001。

总结:

  1. 转换过程繁琐,但只是不好理解而已,写完一遍以后也不怎么管。
  2. 结果集返回一个二进制的表达形式,个人觉得对用户体验很不友好。虽然当前项目面向的是专业人员,但我认为系统需要向傻瓜式操作来开发。直接在数据库中存储标识,前端展示时格式化为数据字典中checkbox对应的汉字更直观。
  3. 该思路异或处理是关键,半路出家的Javaer还没用过异或^ (惭愧~)
  4. 项目需求什么就写什么。

代码实现

package test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Theo
 * @date 2021/8/17
 */
public class Test {

    public static void main(String[] args) {
        //list为模拟前端给传递来的选项
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(5);
        list.add(6);
        c(list);
    }

    private static void c(List<Integer> list){
        int[] numarry = b();
        int aim = 0;
        for(Integer i:list){
            System.out.println("@@@@@@@");
            System.out.println(aim);
            System.out.println(i);
            aim = aim ^ numarry[i-1];
            System.out.println(aim);
        }
        System.out.println("结果:"+Integer.toBinaryString(aim));
    }

    /**
     * 前端存储标识对应的二进制形式α结果集
     * @return
     */
    private static List<String> a(){
        List<String> mainList = new ArrayList<>();
        mainList.add("0000000000000001");
        mainList.add("0000000000000010");
        mainList.add("0000000000000100");
        mainList.add("0000000000001000");
        mainList.add("0000000000010000");
        mainList.add("0000000000100000");
        mainList.add("0000000001000000");
        mainList.add("0000000010000000");
        mainList.add("0000000100000000");
        mainList.add("0000001000000000");
        mainList.add("0000010000000000");
        return mainList;
    }

    /**
     * 二进制形式α的转换为十进制β结果集
     * @return
     */
    private static int[] b(){
        List<String> list = a();
        int[] numarry = new int[list.size()];
        for(int i=0;i<list.size();i++){
            Integer x = Integer.parseInt(list.get(i),2);
            System.out.println(x);
            numarry[i]=x;
        }
        return numarry;
    }
}

打印结果

1
2
4
8
16
32
64
128
256
512
1024
@@@@@@@
0
1
1
@@@@@@@
1
5
17
@@@@@@@
17
6
49
@@@@@@@
49
9
305
结果:100110001

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值