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

PHP 转 Java ,上千张表需要 CRUD

  •  2
     
  •   VensonEEE · 2024-01-03 11:30:07 +08:00 · 10554 次点击
    这是一个创建于 381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原系统是 php 一个开源的系统搞的,积累了多年的数据,大约上千张表。

    现在系统迁移到 java ,传统的 ssm ,顿时尴尬了。这么多表的 crud ,要生成 MVC 、mybaitis 代码,简直是噩梦,而且逻辑基本都一样。

    有无直接成熟的组件,不生成代码,完成这些表的基本 crud 操作,不考虑权限,最好带分页。

    87 条回复    2024-01-09 11:56:16 +08:00
    BaiShui
        1
    BaiShui  
       2024-01-03 11:32:54 +08:00
    mybaitis-plus 看看文档就能搞
    huihuiHK
        2
    huihuiHK  
       2024-01-03 11:34:01 +08:00
    mybaitis-plus 一键生成
    lsk569937453
        3
    lsk569937453  
       2024-01-03 11:34:04 +08:00
    闲得蛋疼才重构。
    zhengshangjin
        4
    zhengshangjin  
       2024-01-03 11:34:21 +08:00
    这不是吃饱了撑的么,PHP 继续迭代跑呗。
    VensonEEE
        5
    VensonEEE  
    OP
       2024-01-03 11:35:10 +08:00
    @BaiShui 没有通用的吧,还得逐个表搞代码。也缺少 controller 那一套东西
    VensonEEE
        6
    VensonEEE  
    OP
       2024-01-03 11:35:54 +08:00
    @zhengshangjin 太老了,漏洞补不了了,刚搞 XC ,一起换了...
    cvbnt
        7
    cvbnt  
       2024-01-03 11:39:17 +08:00 via Android
    IDEA 很多插件能一键生成
    zvvvvv
        8
    zvvvvv  
       2024-01-03 11:40:00 +08:00
    @VensonEEE mybatis-plus 不是有插件根据表字段直接生成 controller 、service 、mapper 嘛
    zvvvvv
        9
    zvvvvv  
       2024-01-03 11:40:11 +08:00
    @zvvvvv 还有实体对象
    VensonEEE
        10
    VensonEEE  
    OP
       2024-01-03 11:48:12 +08:00
    有没有不用生成的,生成几千个文件也很糟心,那种连上数据库就能提供 api 的...
    28Sv0ngQfIE7Yloe
        11
    28Sv0ngQfIE7Yloe  
       2024-01-03 11:59:02 +08:00
    如果都是生成的话 不得有上万个类啊。。这 Java 项目编译一下得多慢?

    这些表有没有什么共同点?没有的话怎么搞出几千个的?
    sparklee
        12
    sparklee  
       2024-01-03 12:02:20 +08:00
    自己封装一下, 直接 JdbcTempleate 执行 sql
    sparklee
        13
    sparklee  
       2024-01-03 12:03:20 +08:00
    plate
    199808lanlan1111
        14
    199808lanlan1111  
       2024-01-03 12:06:47 +08:00 via Android
    团队多少人,这种重构应该要分多个服务
    CheckTime
        15
    CheckTime  
       2024-01-03 12:08:49 +08:00
    要不看看 Jeecg 的代码生成,然后看能不能借鉴。批量导入表,批量生成代码
    gejun123456
        16
    gejun123456  
       2024-01-03 12:30:42 +08:00
    mybatis + pageHelper 就行了,可以试试 intellij 插件 MybatisCodeHelperPro 快速生成代码
    XCFOX
        17
    XCFOX  
       2024-01-03 12:31:31 +08:00
    你可能需要低代码框架:不生成代码,直接启动数据库的 crud 的 GraphQL 接口,后端几乎不用写代码,让前端直接调用 GraphQL 接口。

    https://github.com/graphile/crystal
    https://github.com/SeaQL/seaography
    https://github.com/nocodb/nocodb
    https://github.com/nhost/nhost
    zjsxwc
        18
    zjsxwc  
       2024-01-03 12:39:12 +08:00
    不如直接针对 php 项目写个转译器转换到 java jpa 。
    947347
        19
    947347  
       2024-01-03 12:54:00 +08:00
    @VensonEEE #10

    Spring Data REST
    Spring Data JPA
    cabing
        20
    cabing  
       2024-01-03 13:13:40 +08:00
    如果功能一样,看能不能写个代码生成器
    jlkm2010
        21
    jlkm2010  
       2024-01-03 13:14:15 +08:00
    mybaitis-plus
    potatowish
        22
    potatowish  
       2024-01-03 13:15:17 +08:00 via iPhone   ❤️ 1
    你可能对 java 有什么误解,写代码要灵活。不用生成类,循环读取表,根据表字段动态生成 sql ,我刚毕业那会就做过,大概是报表系统类似的需求
    potatowish
        23
    potatowish  
       2024-01-03 13:20:27 +08:00 via iPhone
    @potatowish 控制器中,一个接口共用,参数传表名、字段名
    mws
        24
    mws  
       2024-01-03 13:56:53 +08:00 via Android
    easycode 插件可以生成 controller ,service 层代码,还可以自己用 velocity 写模板
    cslive
        25
    cslive  
       2024-01-03 14:03:49 +08:00
    velocity 模板生成,其它类似模板也行
    zzzmh
        26
    zzzmh  
       2024-01-03 14:06:48 +08:00
    mybatisplus + idea 插件 mybatisx 但是只能生成 crud 而且是 jsp 还是接口,接口这块应该是要自己写的
    c2const
        27
    c2const  
       2024-01-03 14:16:10 +08:00
    重构不彻底,不如不重构,接着在原来的代码屎山上开发 :)
    mars2023
        28
    mars2023  
       2024-01-03 14:18:29 +08:00
    @XCFOX #17 你这是让 op 不用重构后端,改成重构前端是吧;
    再则,GraphQL 对于客户端真是噩梦 😈(又或者是因为我只是一个很菜的客户端🐶)
    VensonEEE
        29
    VensonEEE  
    OP
       2024-01-03 14:20:23 +08:00
    VensonEEE
        30
    VensonEEE  
    OP
       2024-01-03 14:22:38 +08:00
    大家觉得这个怎么样?
    大量重复代码,我感觉很难接受... 编译速度,启动速度,内存,都是难以接受的。
    #22 是个办法 ,我想找个成熟点的,少修 bug 早下班...
    taogen
        31
    taogen  
       2024-01-03 14:44:38 +08:00
    @VensonEEE #29
    国内开源项目不建议使用
    taogen
        32
    taogen  
       2024-01-03 14:52:05 +08:00
    1. PHP 到 Java ,换语言本来就工作量大,不仅仅是 CRUD 操作工作量大。可以考虑重新设计,用 Java 重写。

    2. 表多不用 ORM (object-relational mapping) 就行,上面已经有人说了用 JdbcTemplate 。
    lcy630409
        33
    lcy630409  
       2024-01-03 14:52:14 +08:00
    你是想要一个读取数据库的工具?
    php 的大部分逻辑都没问题的话,就继续保留,你就直接调用他的接口就行,php 不对外,把 php 当做一个中间层,
    lcy630409
        34
    lcy630409  
       2024-01-03 14:53:27 +08:00
    如果只有你一个人 建议别动算了,怎么方便怎么来 能跑就行,千万别想着大动干戈,不然这年都过不好了
    ZiNai
        35
    ZiNai  
       2024-01-03 15:06:26 +08:00 via iPhone
    让 PHP 老项目继续跑着。新需求开新项目,随便什么你喜欢的技术栈,你这个偏业务的项目核心就是读数据库呗。然后渐进式的替换掉老接口。部分 common lib 直接 gpt 转写或者放 db 的 function 里呗
    zjsxwc
        36
    zjsxwc  
       2024-01-03 15:43:10 +08:00
    @XCFOX #17
    @VensonEEE #28

    我想问一下,GraphQL 与 APIJSON 的使用场景。

    APIJOSN 我看了下它的文档,知道 APIJSON 本质就是一个可以在 json 里嵌入 sql 语句的 sql 方言。

    GraphQL 的 server 我看了下,
    和云厂商的 serverless lambda 差不多,serverless 要用户写每一个 api 的实现,
    GraphQL 同样需要用户写每个 query 与 mutation 的实现,
    serverless 通过 step-functions 来组合不同 api 到一次请求,GraphQL 通过其语法来组合不同查询到一次请求。
    kekeco
        37
    kekeco  
       2024-01-03 15:50:38 +08:00
    写通用的工具生成下就行了 基础的都有了 就看你自己怎么定义模板的问题
    VensonEEE
        38
    VensonEEE  
    OP
       2024-01-03 16:46:38 +08:00
    @zjsxwc 大量的业务表,低代码,多租户;以至于传统的 controller services mapper model 那一套不适用了。
    另一个是接口大多,大部分都是重复的工作量。怎样准确、统一的完成业务,不就得这么玩么。
    chosen1cwp
        39
    chosen1cwp  
       2024-01-03 17:07:29 +08:00
    erupt
    sampeng
        40
    sampeng  
       2024-01-03 17:11:36 +08:00
    从写单元测试开始。上千的表。接口也差不多上千了。你怎么保证重构完了一摸一样的结果和逻辑?
    sampeng
        41
    sampeng  
       2024-01-03 17:12:55 +08:00
    按回车按快了。。
    另一方面肯定不是一蹴而就,前面网关做分离工作,迁移一批网管流转新流量过来一批。反正这么大的规模,就算是看起来是差不多的业务逻辑,但凡错一个,估计得祭天。
    5200
        42
    5200  
       2024-01-03 17:27:15 +08:00
    为什么要重构呢,要不试试 Go ,或者换 PHP 的 swoole 类型的框架。
    zuixinwenyue
        43
    zuixinwenyue  
       2024-01-03 17:35:02 +08:00
    PDManer 看下这个,可以根据表来生成 controller service mapper entity 代码
    meeop
        44
    meeop  
       2024-01-03 17:46:31 +08:00
    逻辑基本都一样,那就还好了,无所谓多少张表,自己写个代码生成机解析库表自动生成
    wu00
        45
    wu00  
       2024-01-03 17:53:55 +08:00
    这种谁弄谁死;
    唯一的出路是逐步替换慢慢迁移
    llf007
        46
    llf007  
       2024-01-03 18:02:10 +08:00
    我们开发个 APISQL 的中间件,不用写 JAVA 代码,直接用 SQL 生成 API ,自带分页。

    如果只是每张表的基本 CRUD ,上千张表应该没什么压力。

    只是再改改软件,让批量对整库每张表生成 API 的问题。

    请到 www.apisql.cn 试着联系我们,看不能帮上忙。
    llf007
        47
    llf007  
       2024-01-03 18:06:27 +08:00
    少了字:(,回复不能修改,再发一下

    我们开发个 APISQL 的中间件,不用写 JAVA 代码,直接用 SQL 生成 API ,自带分页。

    如果只是每张表的基本 CRUD ,上千张表应该没什么压力。

    只是再改改软件,让批量对整库每张表生成 API 的问题。

    请到 www.apisql.cn 试着联系我们,看能不能帮上忙。
    VensonEEE
        48
    VensonEEE  
    OP
       2024-01-03 18:18:14 +08:00
    谢谢各位。

    @llf007 这个是要内网部署的。所以谢谢你了。
    @wu00 @sampeng 大部分都是 crud ,有一些特别的操作肯定是要自己写代码、上测试套装的。
    时间也不急,因为很久没更新了。单纯的不想写 crud 以及搞几千个基础的类。启动太慢了。
    llf007
        49
    llf007  
       2024-01-03 18:26:39 +08:00
    是的,支持企业内网私有化部署。
    renmu
        50
    renmu  
       2024-01-03 19:04:14 +08:00 via Android
    又不是不能用.jpg
    ZZ74
        51
    ZZ74  
       2024-01-03 21:58:19 +08:00   ❤️ 1
    从业多年,没见过几千张表的项目.....
    StarkWhite
        52
    StarkWhite  
       2024-01-04 00:16:42 +08:00
    2023 年了,还有人不知道 meta(facebook) 开源的 graphql ,都快 20k star 了,强烈推荐
    https://www.v2ex.com/t/589138
    StarkWhite
        53
    StarkWhite  
       2024-01-04 00:17:41 +08:00
    graphql 不用写代码,基本啥都能搞定
    ChenSino
        54
    ChenSino  
       2024-01-04 08:09:31 +08:00
    上千表说明业务够复杂,这个也敢动?
    visper
        55
    visper  
       2024-01-04 08:58:53 +08:00
    直接 jdbc 操作。通过表名能读出所有表字段。然后写一个公共的方法 saveData(Map data, String tableName) 根据 data 里面的 id 去查一下如果存在就造成 updatesql 如果不存在就生成 insert......
    summerLast
        56
    summerLast  
       2024-01-04 09:26:51 +08:00
    你需要的是搞一个路径到表的映射
    cndenis
        57
    cndenis  
       2024-01-04 09:39:11 +08:00
    @ZZ74 按日期分表的项目, 每天新建几张表, 很容易就几千张
    fengfisher3
        58
    fengfisher3  
       2024-01-04 09:42:54 +08:00
    @StarkWhite 友情提示,已经 2024 年了。
    kd9yYw2RyhQwAwzn
        59
    kd9yYw2RyhQwAwzn  
       2024-01-04 09:47:21 +08:00
    @VensonEEE 这个很不建议
    loginv2
        60
    loginv2  
       2024-01-04 10:19:11 +08:00
    还不如升级 PHP ,代价小的多
    zzzzzzZ
        61
    zzzzzzZ  
       2024-01-04 10:29:25 +08:00
    @StarkWhite 2024 年了还有人在推 GraphQL 啊?
    VensonEEE
        62
    VensonEEE  
    OP
       2024-01-04 10:39:27 +08:00
    @ChenSino @ZZ74 @cndenis 确实类似这种... 一类业务一个台账,数据多且杂,不好合并表。 现在不是推 xinchuang 么 PHP 这个玩意儿有点 ZZ 不正确
    zw1one
        63
    zw1one  
       2024-01-04 10:50:38 +08:00
    你弄成 BI 项目呗,写在代码里的 javabean 都是系统常用的 crud 。你几千张表的需求一般是数据中台或者 BI 项目了。
    WashFreshFresh
        64
    WashFreshFresh  
       2024-01-04 10:57:48 +08:00
    如果都是单表查询 我建议 jpa
    jonsmith
        65
    jonsmith  
       2024-01-04 10:58:05 +08:00
    这么多表也敢重构,计划多久完成?期间有新功能迭代咋办?投入大量人力老板会支持吗?
    shalk
        66
    shalk  
       2024-01-04 11:32:09 +08:00
    生成基本的 crud 简单。
    不过 php 转 java ,一个接口可能有几十种上百种 if 判断,同时操作多个表,照着 java 写,可能各种看不懂,这个才是噩梦。
    ragnaroks
        67
    ragnaroks  
       2024-01-04 14:16:39 +08:00
    拆分接口增量迁移
    dc2002007
        68
    dc2002007  
       2024-01-04 14:32:03 +08:00
    换 golang 也行啊 ,换什么 java ?
    StarkWhite
        69
    StarkWhite  
       2024-01-04 14:48:07 +08:00
    StarkWhite
        70
    StarkWhite  
       2024-01-04 15:01:30 +08:00   ❤️ 1
    @fengfisher3 哦对,2024 年了还有不知道 graphql 的。。。
    KP45
        71
    KP45  
       2024-01-04 15:21:39 +08:00
    StarkWhite
        72
    StarkWhite  
       2024-01-04 15:26:30 +08:00
    @ZZ74 我也是,几千张表太夸张了,不知道是不是分库分表导致的 @VensonEEE
    StarkWhite
        73
    StarkWhite  
       2024-01-04 15:42:45 +08:00
    @mars2023 graphql 把你咋了?居然说成是噩梦
    nbboy
        74
    nbboy  
       2024-01-04 15:50:27 +08:00
    转个 p,不整理业务,换语言也只能让你从一个泥潭跳入另外一个泥潭
    StarkWhite
        75
    StarkWhite  
       2024-01-04 16:04:30 +08:00
    @zzzzzzZ graphql 还是很火啊,怎么不能推了?
    StarkWhite
        76
    StarkWhite  
       2024-01-04 16:18:52 +08:00
    @shalk 所以要像 #18 @zjsxwc 说的写个 php - java 的转译器?
    ceekay
        77
    ceekay  
       2024-01-04 16:55:28 +08:00
    写个 ftl 模板 再加个生成器 增删改查加注释文档全有了 然后找到对应的 api 去加业务 无非还是 token 鉴权的事情
    watzds
        78
    watzds  
       2024-01-04 17:01:19 +08:00
    到底什么样的表,你把表名当参数传进去呢
    hobbitlhy
        79
    hobbitlhy  
       2024-01-04 17:05:34 +08:00
    mybatis-plus 代码生成器,自己配置一套模板,生成一下应该可以的
    ixixi
        80
    ixixi  
       2024-01-04 17:08:23 +08:00
    把表的数据存成 json 这样用一张表就行了 🤭
    coolmenu
        81
    coolmenu  
       2024-01-04 17:08:23 +08:00
    不如升级 php 实用呢。。。上千个表,好多字段当时怎么设计的,比如删除是做标记还是物理删除,这么多细节,太可怕了。
    ymz
        82
    ymz  
       2024-01-04 17:28:35 +08:00
    @shalk 为什么 一个接口可能有几十种上百种 if 判断 ,这什么垃圾代码
    StarkWhite
        83
    StarkWhite  
       2024-01-04 18:53:03 +08:00
    @ymz 复杂业务下,挺正常的
    AnsonZao
        84
    AnsonZao  
       2024-01-05 00:12:30 +08:00
    推荐你试试这个 fireboom.cloud
    EthanV2
        85
    EthanV2  
       2024-01-05 09:22:13 +08:00
    刚刚发现这种,https://gitee.com/ssssssss-team/magic-api
    magic-api 是一个基于 Java 的接口快速开发框架,编写接口将通过 magic-api 提供的 UI 界面完成,自动映射为 HTTP 接口,无需定义 Controller 、Service 、Dao 、Mapper 、XML 、VO 等 Java 对象即可完成常见的 HTTP API 接口开发
    williamshan
        86
    williamshan  
       2024-01-05 12:17:47 +08:00 via Android
    mybatisplus 的代码生成器
    BaiShui
        87
    BaiShui  
       2024-01-09 11:56:16 +08:00
    @VensonEEE controller service mapper entity 这些代码都可以一键生成
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2759 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:58 · PVG 20:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.