老哥们好,关于 Java ORM 选型的问题,有问题请教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Lnanvily
V2EX    Java

老哥们好,关于 Java ORM 选型的问题,有问题请教

  •  
  •   Lnanvily 2024-06-17 15:49:52 +08:00 5625 次点击
    这是一个创建于 479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟是新人上路,正在使用 SpringCloud 进行一个娱乐直播平台小项目的练手开发,在选择 ORM 框架时看到大家的争论有点摸不清头脑。

    TLDR:

    小弟进行练手开发是为了尽快提高到能进入企业熟练打杂的水平,但是因不知道目前企业主流的方案而感到困扰,希望大佬们能指点一下 ORM 选型,小弟感激不尽 

    背景

    目前试用了 Mybatis+ MybatisPlus/tk.mapper/mybatis-mapper 几种方案 其中最有意向的时 Mybatis+Mybatis Plus 的方案,使用 mybatis 的 XML 写一些比较复杂的查询,用 MP 的 QueryWrapper 进行一些简单的查询。

    tk.mapper/mybatis-mapper 用起来似乎与 quweryWrapper 区别不大,但写起来略感麻烦,不是很倾向使用 其他的 mybatis 方案如 fluent-mybatis,mybatis-flex 更是看的小弟眼花缭乱,这些框架的支持者都各有各的说辞,实在难以分辨

    除 Mybatis 之外,小弟还注意到有 JPA+hibernate,以及 QueryDSL 等等五花八门的方案,各方的支持者也是你不让我我不让你

    额外请求

    打听到的公司目前使用的技术包括 SpringCloud,k8s,elasticSearch,kafka 等,各位大佬能否提供一些学习建议,小弟感激不尽。 
    47 条回复    2024-07-06 18:10:17 +08:00
    lsk569937453
        1
    lsk569937453  
       2024-06-17 15:56:59 +08:00   1
    Mybatis+Mybatis Plus 无脑用这个方案就行了,使用量大,碰到的问题网上基本都有答案。
    infreboot
        2
    infreboot  
       2024-06-17 15:59:12 +08:00
    Mybatis Plus 就成。国内主流。
    我现在在用 JPA 也挺舒服
    ByteCat
        3
    ByteCat  
       2024-06-17 16:04:30 +08:00
    选哪个都行,挑个自己喜欢的就好了。
    一般的公司用 MyBatis 系( MyBatisPlus 之类)
    我自己项目用 JPA ,现在换 JOOQ 了,更爽
    0xD800
        4
    0xD800  
       2024-06-17 16:54:33 +08:00
    mybatis-mapper 的 wrapper 比 mp 的 Lambda 好用一点,mp 的 lambda 还需要传类型才能获取到类型提示,mybatis-mapper 直接.wrapper().eq(getXXX, vv)就可以获得到类型提示。不过 mybatis-mapper 有一些功能要自己实现比如自动设置 createBy 、乐观锁字段,这些都有解决方案,可以加新版 mapper 群讨论
    cheng6563
        5
    cheng6563  
       2024-06-17 16:59:05 +08:00
    Mybatis Plus 就行了,用的很广。

    jpa 这类硬 orm 国内用的少,用起来稍微复杂一点的查询就非常蛋疼
    shanai
        6
    shanai  
       2024-06-17 17:02:54 +08:00
    jpa + querydsl 配合有 QuerydslPredicateExecutor 可以做到不写 sql 用起来还是比较爽的
    shanai
        7
    shanai  
       2024-06-17 17:04:21 +08:00
    @shanai 不过这个不是主流
    txzh007
        8
    txzh007  
       2024-06-17 17:04:58 +08:00
    看数据库怎么设计了.mp 最大的问题就是写 wrapper 会把数据库属性字段写到业务代码中,个人还是更喜欢 jpa
    issakchill
        9
    issakchill  
       2024-06-17 17:11:52 +08:00
    无脑 mp 吧
    northernsongy2
        10
    northernsongy2  
       2024-06-17 17:15:19 +08:00
    如果是学习为目的,那么看眼缘选一个,然后深入学学源码,如果是公司要求,那么就跟公司走
    jlkm2010
        11
    jlkm2010  
       2024-06-17 17:17:30 +08:00
    Mybatis+Mybatis Plus ,或者 BeetlSQL
    Ayanokouji
        12
    Ayanokouji  
       2024-06-17 17:21:48 +08:00
    推荐个小众框架 https://ebean.io
    nothingistrue
        13
    nothingistrue  
       2024-06-17 17:28:18 +08:00
    选型是架构师(或者个人开发者)干得,并且是只在项目开工或重构期间才干的活,搬转码农就不要去想了。

    新搬转的水平,九成九取决于过往搬转的经验和那期间对经验的总结和学习,非搬转期间的自学、实练什么的,(仅限对于将来搬转的影响)不能说毫无作用,只能说没啥卵用。

    如果是纯粹的学习,那就无脑跟着 spring.io 以及它使用的第三方框架学。其他五花八门的方案,都只是工具,只有 Spring 体系是课程。
    final7genesis
        14
    final7genesis  
       2024-06-17 17:53:23 +08:00
    mybatis plus 关联查询还是要写 sql 吧,jpa 配置下 onetomany manytomany 啥的 关联查询也不用写 sql
    hdfg159
        15
    hdfg159  
       2024-06-17 19:05:50 +08:00 via iPhone
    无脑 mbp ,国内主流
    LiamCheng
        16
    LiamCheng  
       2024-06-17 19:33:10 +08:00
    第一次用 JPA 最近发现某几个表 明明只进行了一次修改 entity 也只有一次修改 但是看 sql 日志 就是被多更新了 5 次 目前还没找到原因…
    xmtpw
        17
    xmtpw  
       2024-06-17 21:07:24 +08:00
    @Ayanokouji 看了下文档还不错啊,老哥稳
    9c04C5dO01Sw5DNL
        18
    9c04C5dO01Sw5DNL  
       2024-06-17 21:09:47 +08:00
    Mybatis Plus 就行了,不要把时间浪费在这些 crud 框架上。终其一生也写不了多少 crud
    Lnanvily
        19
    Lnanvily  
    OP
       2024-06-17 22:30:55 +08:00
    非常感谢大佬们的指点,正在全力开码中...
    dasbn
        20
    dasbn  
       2024-06-17 22:59:14 +08:00   1
    ZeroDu
        21
    ZeroDu  
       2024-06-17 23:18:48 +08:00
    搬砖多年的告诉你:直接选 Mybatis Plus 就好,要联查的话:有基于 mp 扩展的 Mybatis Plus join 。还有建议使用 Lambda 开头的各种 Wrapper 。
    ZeroDu
        22
    ZeroDu  
       2024-06-17 23:27:51 +08:00
    @dasbn #20
    https://baomidou.com/reference/about-cve/

    其实这个就是之前官方文档没说明普通 wapper 和 lambda 的区别, 没说明风险。
    09an6YfX8rNvIG92
        23
    09an6YfX8rNvIG92  
       2024-06-17 23:46:55 +08:00
    新手直接 Mybatis Plus
    楼主明显是自己练习,想要快点能工作
    在国内基本只有 mybatis 系可以选
    不要推荐 jpa 了,国内没有水平可以的教程不说,学习难度远大于 mybatis ,企业也基本不用,学了基本没用
    VeteranCat
        24
    VeteranCat  
       2024-06-18 07:55:29 +08:00
    自己玩随意,团队开发选择使用量大的。
    dbpe
        25
    dbpe  
       2024-06-18 08:45:08 +08:00
    大环境是 mp..那就 mp 咯...毕竟很多人还是喜欢用 sql 写业务。(有些用 sql 的确简单很多)

    至于 Ebean 、JOOQ 、QueryDSL 这些东西,都是歪门邪道,让我们自己爽就好了。。


    PS: 没事多看看也是好的。。有时候我看到一些 mybats 增强,怎么看怎么都是往 jpa 那边靠,导致不伦不类的。(哎)
    murmur
        26
    murmur  
       2024-06-18 08:55:23 +08:00
    @dasbn 我感觉没问题,数据库的列还允许前端传入,前端传入的参数还不校验,然后甩锅给框架,这样的人还是开掉比较好

    做后端第一件事不就是不能相信前端的任何参数么
    ExplodingDragon
        27
    ExplodingDragon  
       2024-06-18 08:56:10 +08:00
    如果是个人的话想用啥就用啥咯,就算是 jetbrains 的 exposed 也不是不能用
    wetalk
        28
    wetalk  
       2024-06-18 09:08:27 +08:00
    你也不想在 Java 代码中拼接复杂 SQL 吧
    wqhui
        29
    wqhui  
       2024-06-18 09:16:16 +08:00
    @zhenglinsmile jpa 会管理 entity 实体,印象中是个叫生命周期管理之类的东西。如果你应用内存中的 entity 对象带有主键,比如执行 save 或者 select 出来,然后直接改 entity 内容,修改内容会自动同步到数据库,不需要显式调用更新保存
    zhenjiachen
        30
    zhenjiachen  
       2024-06-18 09:17:17 +08:00 via iPhone
    @dbpe 赞同,还不如直接 jpa 加 querydsl ,jooq 也可以但是低半版本数据库收费
    jorneyr
        31
    jorneyr  
       2024-06-18 09:26:54 +08:00
    推荐要么 MyBatis ,要么 JPA ,纯粹一些。
    NikoXu
        32
    NikoXu  
       2024-06-18 09:54:11 +08:00   1
    springdata Jpa + querydsl
    JoJoWuBeHumble
        33
    JoJoWuBeHumble  
       2024-06-18 10:15:02 +08:00
    找工作就是无脑 MP ,百分之八十以上的公司都是 MP 。
    上家公司用的是 JPA ,问题数据库设计一泡污,导致 JPA 用起来非常不顺手,对新技术又抵触,不愿意引入 querydsl 。
    JoJoWuBeHumble
        34
    JoJoWuBeHumble  
       2024-06-18 10:17:38 +08:00
    而且你不需要纠结到底是 JPA 还是 MP ,现在 MP 反而不少功能在往 JPA 上面靠。最重要的是 SQL 能写明白就好了
    limyel
        35
    limyel  
       2024-06-18 10:57:54 +08:00
    mybatis plus +1 ,至于 jpa 用到了再学,国内很多厂商的习惯是会自己封装一套 jpa 的查询接口...
    kratosmy
        36
    kratosmy  
       2024-06-18 11:27:29 +08:00
    目前用的是 JPA ,但是一个方法名太长了。。
    yeyang5211
        37
    yeyang5211  
       2024-06-18 11:31:17 +08:00
    mybatis plus +1 , 简单好用 适用面广
    Cruzz
        38
    Cruzz  
       2024-06-18 11:36:08 +08:00
    自己用用 jpa 。如果公司用尽量别用 jpa ,到时候用着用着 selectbyid 就变成扫全部关联表了。
    kenvix
        39
    kenvix  
       2024-06-18 12:01:16 +08:00
    直接上 jOOQ 。别给自己添堵
    ychost
        40
    ychost  
       2024-06-18 15:22:39 +08:00
    如果是 Java 那么直接 MBP 就好了,用的人多坑少,如果用 Kotlin 那么建议 Ktorm 用起来比各种 Java 的 ORM 都爽太多,JOOQ 也好、JPA 也好只要是基于 Java 的那么没有语法糖加持都写起来怪怪的
    Goooooos
        41
    Goooooos  
       2024-06-18 15:25:24 +08:00
    小项目 jdbctemplate ,直接写 sql
    LiamCheng
        42
    LiamCheng  
       2024-06-18 19:27:28 +08:00
    @wqhui 确实应该是这个问题 不过我之前排查了代码 除了处理业务那块 其它地方没有定位到对 entity 的修改位置 只能等后面闲了继续查查…
    codingmiao
        43
    codingmiao  
       2024-06-19 09:07:27 +08:00
    @dasbn 我觉得 Mybatis Plus 作者喷得对,允许传 sql 片段在纯后端用带来很大的灵活性,而且自己可控传什么,总不能自己给自己传个注入语句。使用者自己非要把这个特性暴露给前端还不在执行前做校验( Mybatis Plus 本身也提供了 sql 注入检测的工具类),把刀子递给黑客还怪刀尖没做安全设计这不是纯纯巨婴行为。
    chuck1in
        44
    chuck1in  
       2024-06-20 11:31:33 +08:00
    @Ayanokouji 之前一直在找一个轻量级的 orm 框架,想不到还真有。。。。。
    chuck1in
        45
    chuck1in  
       2024-06-20 11:58:56 +08:00
    @zhenjiachen 有开源版本,支持开源数据库,是不收费的。除非你用 oracle 这些。
    LiamCheng
        46
    LiamCheng  
       2024-06-20 13:20:09 +08:00
    @wqhui 最终定位到原因了,因为是创建用户,有非常多的初始化资源操作。很多地方使用了 saveAndFlush 这个方法。修改为 save 方法之后,就没有被无效更新了。
    chuliuxiang
        47
    chuliuxiang  
       2024-07-06 18:10:17 +08:00
    国内一般都是 mybatis 或者 mybatis-plus ,其实单纯 mybatis+mybatis-generator 就很好用了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:48 PVG 08:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86