V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaofdejimo
V2EX  ›  Java

渣渣求教, Java 如何通过数据库中字段(动态的)创建实体类( model)

  •  
  •   xiaofdejimo · 2017-07-05 00:15:15 +08:00 · 5090 次点击
    这是一个创建于 2700 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为数据库里表的字段是动态的,每次用的时候想根据字段反过来动态的生成实体类,不是静态的可以直接写一个实体类做映射关系就行,求教大腿用反射怎么写

    26 条回复    2017-07-10 10:23:57 +08:00
    xiaofdejimo
        1
    xiaofdejimo  
    OP
       2017-07-05 00:31:45 +08:00
    就是 Json Gen 这个网站的功能,具体是怎么实现的?
    <a href="http://jsongen.byingtondesign.com/">jsongen</a>
    Lonely
        2
    Lonely  
       2017-07-05 00:37:35 +08:00
    你是要在程序运行时根据表字段动态生成类?
    zhangbohun
        3
    zhangbohun  
       2017-07-05 00:38:28 +08:00 via Android
    用 map 不知道行不行?
    Kilerd
        4
    Kilerd  
       2017-07-05 01:34:50 +08:00 via iPhone
    工厂模式生产出来啊
    SaltedFish12138
        5
    SaltedFish12138  
       2017-07-05 08:09:54 +08:00 via Android
    我觉得用 fastjson 应该能满足你的需求。只是不知道除了属性,楼主对实体类有什么其他的要求没?
    ixiaohei
        6
    ixiaohei  
       2017-07-05 08:31:54 +08:00
    mybatis 好像有这个功能,根据字段的值反射不同的实体。另外感觉你数据库模式设计有问题,后面会很难维护的。
    peoce
        7
    peoce  
       2017-07-05 08:49:42 +08:00
    licht114
        8
    licht114  
       2017-07-05 08:58:07 +08:00
    eclipse 有反向生成。
    paragon
        9
    paragon  
       2017-07-05 10:05:18 +08:00
    mybatis generator 不谢~
    em84
        10
    em84  
       2017-07-05 10:10:50 +08:00
    逆向工程?
    solee
        11
    solee  
       2017-07-05 10:16:38 +08:00
    @paragon 那个只能算生成,也是静态的。我理解的动态是数据库改了字段,程序自己就可以生成 model。这个高大上的技术,还没听过~
    zpf124
        12
    zpf124  
       2017-07-05 10:53:02 +08:00
    @solee 你这个想法非常诡异啊, 动态的运行中也会随时更新实体类? 你代码怎么写?

    你之前 有个文章的表 ,写了一个字段 content, 结果因为显示界面结构变了, 数据库改成了 title,directions。
    你怎么自动生成? 实体类动态生成了,页面展示不出来了怎么处理器? 难道连页面也自动生成?
    smithtel
        13
    smithtel  
       2017-07-05 10:59:13 +08:00 via Android
    设计有问题,为何要语言去修正
    jalena
        14
    jalena  
       2017-07-05 11:17:11 +08:00
    我在纠结什么样的系统会频繁的修改字段?
    pengfei
        15
    pengfei  
       2017-07-05 11:20:00 +08:00
    怎么感觉原先的设计是基于缓存或 ES 的,后改成数据库了 -,-
    bk201
        16
    bk201  
       2017-07-05 11:37:55 +08:00
    @xiaofdejimo Json Gen 这个不就是普通的文本语义处理?
    hwding
        17
    hwding  
       2017-07-05 12:04:03 +08:00
    是不是只能 asm.jar 了
    hwding
        18
    hwding  
       2017-07-05 12:06:17 +08:00
    The only required component to generate a class is the `ClassWriter` compo-
    nent.
    Librazy
        19
    Librazy  
       2017-07-05 13:56:13 +08:00
    或许你需要 javac 和一个支持动态 load/reload 的 classloader?
    大概是现场编译一个加载进来反射着玩……
    solee
        20
    solee  
       2017-07-05 14:07:09 +08:00
    @zpf124 所以啊 我觉得楼主标题很迷惑,如果只是生成 model 那工具太多啦~ 很久没接触过 java 了,还以为又进化出什么很黑科技的技术,哈哈~

    楼主说的:“因为数据库里表的字段是动态的,每次用的时候想根据字段反过来动态的生成实体类”

    也就是说每次生成一次 model 再 run
    ihuotui
        21
    ihuotui  
       2017-07-05 21:28:48 +08:00 via iPhone
    用 eav 设计或者 json ?既然动态数据就动态保存啊
    xiaofdejimo
        22
    xiaofdejimo  
    OP
       2017-07-07 11:03:06 +08:00
    @zpf124
    @solee
    @jalena
    solee 理解的没错,因为系统是对内部的系统,数据分析人员会改动表结构,而其他员工又需要在前端筛选数据,所以实体类不能写死,得动态生成出来给 service 用,我也很惆怅啊
    xiaofdejimo
        23
    xiaofdejimo  
    OP
       2017-07-07 11:06:01 +08:00
    @ixiaohei
    本身因为表都不是自动维护,是数据分析的人做完分析再改动,所以后端就得做成动态的,我也很惆怅啊
    zpf124
        24
    zpf124  
       2017-07-07 11:26:44 +08:00
    @xiaofdejimo 神经病需求啊.... 那前端筛选项怎么自动渲染,怎么获取实体类的属性名? 反射?

    既然要动态,那要屁的实体类,直接 map 得了, 渲染的时候 直接遍历 map,有一个 key 显示一个筛选框。
    solee
        25
    solee  
       2017-07-07 17:45:51 +08:00
    @xiaofdejimo 感觉 mongodb 就是针对这种需求啊~ 你也不用在乎字段 json 随便组合啊
    jalena
        26
    jalena  
       2017-07-10 10:23:57 +08:00
    @zpf124 +1,或者直接 JSON 吧,哪里非得要实体呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2350 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:10 · PVG 00:10 · LAX 08:10 · JFK 11:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.