V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
t298
V2EX  ›  程序员

Java 在导出数据的时候,数据库存的是 1, 2, 3 这样的数字,实际上的业务对应的是汉字,应该怎么导出数据呢?

  •  
  •   t298 · Feb 18, 2025 · 2285 views
    This topic created in 435 days ago, the information mentioned may be changed or developed.

    比如一个站点类型,是通过系统上的字典绑定的,比如 1 对应类型 a ,2 对应类型 b 这样。页面上显示的肯定是类型 a,b,c 。数据库里存的是 1/2/3 。现在涉及到导出数据的话,应该怎么导出的时候做处理呢?

    18 replies    2025-02-19 17:01:14 +08:00
    evan1
        1
    evan1  
    PRO
       Feb 18, 2025
    找下数据库到页面显示时相关的转换代码,导出的时候复用下。
    ChovyChu
        2
    ChovyChu  
       Feb 18, 2025
    写个注解,导出时转换
    evan1
        3
    evan1  
    PRO
       Feb 18, 2025
    @evan1 #1 如果是直接从数据库导出的话可以导出后对数据进行一下二次处理,还是复用数据库到页面显示相关的转换代码。
    YJi
        4
    YJi  
       Feb 18, 2025
    之前需要导出表格,用的 easyexcel ,然后可以根据属性自定义 converter 。
    t298
        5
    t298  
    OP
       Feb 18, 2025
    @evan1 目前是把查询字典的接口给到前端,前端在展示的时候处理。

    @ChovyChu 能具体一些嘛

    @YJi 我也去看看这个。
    L0L
        6
    L0L  
       Feb 18, 2025
    哈哈哈,我见过直接 case 转换的,在 sql 里直接转换,出结果
    Plutooo
        7
    Plutooo  
       Feb 18, 2025
    用最笨的方法,后端也存一套枚举,然后 forEach 操作
    t298
        8
    t298  
    OP
       Feb 18, 2025
    @L0L
    @Plutooo 那要是新加字典名称,或者改一下。那不就炸了
    iyiluo
        9
    iyiluo  
       Feb 18, 2025
    懒得写代码可以直接复制一份表,直接用 sql 把枚举字段替换掉,导出复制表
    Cestbonmmm
        10
    Cestbonmmm  
       Feb 18, 2025
    用最笨的方法,后端也存一套枚举,然后 forEach 操作 +1
    不用怕字典变动,有 gpt 生成。导出 Excel 的需求变得也快,不要过度设计
    L0L
        11
    L0L  
       Feb 18, 2025
    @t298 接着改 sql 啊,或者不怕 sql 注入,直接 mybatis 硬拼接字典值进去,形成一个动态拼接的代码。但是不建议这么搞啊,要被吐槽的。
    shen13176101
        12
    shen13176101  
       Feb 18, 2025
    听你的描述,sql 关联字典表,就能实现了。那里还会有问题呢
    FawkesV
        13
    FawkesV  
       Feb 18, 2025
    维护专门的字典表。
    然后写一个反序列化的注解 DictTranslate
    然后写一个反序列化实现:class DictSerializer extends JsonSerializer<String> implements ContextualSerializer
    返回的时候直接在原本的 type 增加 typeName 字段做展示 。
    yinmin
        14
    yinmin  
       Feb 18, 2025 via iPhone
    如果编码固定基本不变(不是部署后可维护的字典表),就让前端写一个 class method ,输入编码输出文字 switch case 写死在代码里。就是有几个 class 下面有一堆的 method 专门将编码转换成文字(硬编码)。如果前端比较糙,或者不想让用户获取到完整字典表,class method 硬编码写在后端也行。

    如果是部署后可维护的字典表,数据库 join 后,编号和对应文字同时传给前端。
    yinmin
        15
    yinmin  
       Feb 18, 2025 via iPhone
    @t298 #5 字典表查询接口给前端,前端要疯掉了,假设服务器在北京,用户在海南,延时 50ms ,前端调一次接口 50ms ,界面可能有几十上百个编码转换文字,如果调用几十上百次光延时就够呛,一个界面调用字典表查询接口的次数像是 ddos 攻击了。

    要么 api 同时将编码和文字发给前端,要么就把编码文字对照表 json 一次性发给前端,或者给前端一个 word/excel 让前端硬编码。
    yinmin
        16
    yinmin  
       Feb 18, 2025 via iPhone
    后端程序与数据库交互一次 5ms-30ms (数据汇总可能更长时间);前端与后端交互一次 10ms-100ms ,每 100kb 数据再加 100ms-1 秒。 一个界面会有几次前端-后端-数据库交互,大致能方案算出行不行。
    Sum0l
        17
    Sum0l  
       Feb 19, 2025
    数据翻译框架,国内有开源项目。https://easy-trans.dromara.org/
    tangxueming13
        18
    tangxueming13  
       Feb 19, 2025
    1.sql case (看场景是否适用)
    2. 服务端 converter (很优雅)
    3. 数据库直接加一列 (以前 leader 说过, 要学会冗余,别整天范式)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   983 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 21:54 · PVG 05:54 · LAX 14:54 · JFK 17:54
    ♥ Do have faith in what you're doing.