javaer 们, JPA 和 mybatis,喜欢用哪一个 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tsingke
V2EX    程序员

javaer 们, JPA 和 mybatis,喜欢用哪一个

  •  1
     
  •   tsingke 2020-09-25 12:24:45 +08:00 12699 次点击
    这是一个创建于 1842 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mybatis 新出了 https://github.com/mybatis/mybatis-dynamic-sql 简单查询用起来很爽。

    92 条回复    2020-09-27 18:39:16 +08:00
    onikage
        1
    onikage  
       2020-09-25 12:37:02 +08:00
    jpa+1, 手上项目对数据库要求不高, 还有 h2 的, 毕竟省事.
    jamesxu
        2
    jamesxu  
       2020-09-25 12:43:14 +08:00 via iPhone
    简单查询 example 搞定
    EscYezi
        3
    EscYezi  
       2020-09-25 12:47:46 +08:00 via iPhone
    个人喜欢用 JPA,工作用 Mybatis
    mango88
        4
    mango88  
       2020-09-25 12:52:03 +08:00
    JPA + 1
    KarlChen2015
        5
    KarlChen2015  
       2020-09-25 13:01:53 +08:00
    业务越大 Mybatis 越好用
    wangyanrui
        6
    wangyanrui  
       2020-09-25 13:05:45 +08:00 via Android
    jpa
    wangyanrui
        7
    wangyanrui  
       2020-09-25 13:07:54 +08:00 via Android   1
    不对,应该说是 JPA 加 QueryDSL
    实话实说,我个人讨厌 mybatis楼下大神们莫要喷我,个人看法
    sagaxu
        8
    sagaxu  
       2020-09-25 13:19:07 +08:00 via Android   5
    mybatis 恶臭,只剩中国人在用了
    HENQIGUAI
        9
    HENQIGUAI  
       2020-09-25 13:22:41 +08:00
    打算试试 jooq
    chendy
        10
    chendy  
       2020-09-25 13:25:39 +08:00
    jpa,项目里没有太复杂的查询
    zjsxwc
        11
    zjsxwc  
       2020-09-25 13:28:14 +08:00
    jpa 越 java 越好
    BreadBig
        12
    BreadBig  
       2020-09-25 13:41:39 +08:00
    JPA+1,维护过其他人的 mybatis 项目,业务也挺简单的,但逻辑大部分都放在了 sql 里,简单的功能一下复杂得一匹( sql 烂一定是我的错)
    gowk
        13
    gowk  
       2020-09-25 13:59:12 +08:00 via Android   4
    只用 jdbctemplate 的同学有没有?
    Asuka0947
        14
    Asuka0947  
       2020-09-25 13:59:56 +08:00
    JPA
    Yogpre
        15
    Yogpre  
       2020-09-25 14:00:35 +08:00
    jpa+mybatis,简单查询 jpa,复杂查询统计 mybatis
    wjpdev
        16
    wjpdev  
       2020-09-25 14:27:05 +08:00
    JPA+1 , 代码量工作量最少
    NeverNot
        17
    NeverNot  
       2020-09-25 14:31:12 +08:00   1
    喜欢用 mybatis,集成 mybatis plus,舒服的一批,想写 sql 就写 sql,不想写就 warpper 查询,也很方便,但是 jpa 就不行了,遇到联表查询 就残废
    aegon466
        18
    aegon466  
       2020-09-25 14:42:19 +08:00
    mybatis-plus 香的一批 单表和 jpa 一样 复杂直接写 sql 奴我直言 其他都是辣鸡
    a719031256
        19
    a719031256  
       2020-09-25 14:47:32 +08:00
    工作用 mybatis,我个人来说更喜欢 jpa,mybatis 的 xml 简直让人发疯
    tinyuu
        20
    tinyuu  
       2020-09-25 15:03:39 +08:00
    pagehelper + Mapper 更好
    wiix
        21
    wiix  
       2020-09-25 15:05:54 +08:00
    jpa + jdbctemplate,mybatis 就是辣鸡
    overthemoon
        22
    overthemoon  
       2020-09-25 15:06:26 +08:00   1
    两个一起用
    AJQA
        23
    AJQA  
       2020-09-25 15:07:25 +08:00
    一张列表页面 有很多条件需要查询 java 怎么办 不使用类似 elasticsearch
    是不是一堆
    if( key exists request) query.and(Model.key= value)
    NotFoundEgg
        24
    NotFoundEgg  
       2020-09-25 15:08:22 +08:00   2
    mybatis+1
    单表操作直接 mybatis plus
    多表查询自己写 xml
    xurunfei
        25
    xurunfei  
       2020-09-25 15:13:02 +08:00
    mybatis + mybatis plus ,公司用了 jpa,然后遇到统计是真的难受,mybatis plus 使用上感觉和 jpa 差不多了,还是喜欢 mybatis
    asmoker
        26
    asmoker  
       2020-09-25 15:18:31 +08:00
    我选择用 SQLAlchemy ...(走错片场了
    coang
        27
    coang  
       2020-09-25 15:19:03 +08:00
    mybatis..
    @tinyuu 这两个没有更新了 准备转 mybatis plus
    asmoker
        28
    asmoker  
       2020-09-25 15:19:05 +08:00
    JPA 联表确实是别扭的一 P
    ymz
        29
    ymz  
       2020-09-25 15:34:16 +08:00
    简单 jpa,复杂 mybatis
    bitmin
        30
    bitmin  
       2020-09-25 15:41:39 +08:00
    JPA 简单查询用方法名查, 联表或者复杂查询直接 @Query 手写 sql, 返回复杂对象的时候写个 interface

    感觉 mybatis 麻烦多了

    看了一下同事使用 mybatis pagehelper 的方式, 自己接受不了

    喜欢手写 sql, 不管啥语言框架都一样的使用方式
    laoyur
        31
    laoyur  
       2020-09-25 15:51:49 +08:00
    jooq:我这么没有排面的啊?
    astkaasa
        32
    astkaasa  
       2020-09-25 15:56:00 +08:00
    spring data jdbc
    jimrok
        33
    jimrok  
       2020-09-25 15:57:15 +08:00
    JPA 没有用过,不过 mybatis 这东西确实头疼。
    avalon0624
        34
    avalon0624  
       2020-09-25 16:00:26 +08:00
    JPA
    BBCCBB
        35
    BBCCBB  
       2020-09-25 16:01:06 +08:00
    mybatis + mybatis-plus 这一类东西, 不知道楼上说 mybatis 有问题是有啥问题?

    jpa 多表查询难用..
    FanError
        36
    FanError  
       2020-09-25 16:11:27 +08:00
    JdbcTemplate 加模仿 ActiveRecord 写了个简单的 ORM 。

    简单 SQL 用 ActiveRecord ORM 一波,复杂的用 JdbcTemplate 手写 SQL
    letitbesqzr
        37
    letitbesqzr  
       2020-09-25 16:16:59 +08:00
    @KarlChen2015 #5

    我觉得相反,应该是性能要求越高业务约简单的场景用 mybatis 更好。 那种复杂业务动不动几千上万张表的系统,mybatis 关联都要写吐
    vayci
        38
    vayci  
       2020-09-25 16:17:11 +08:00
    简单小项目 JPA,大点的 mybatis
    Yechs
        39
    Yechs  
       2020-09-25 16:20:13 +08:00
    mybatis 一改表结构就真的恶心了
    TheWidowMaker
        40
    TheWidowMaker  
       2020-09-25 16:41:41 +08:00 via Android
    ?通常都是用 jpa 把表建了就删掉了…然后开始用 mybatis
    zlllllei
        41
    zlllllei  
       2020-09-25 16:45:54 +08:00
    @Yechs 用 mybatis plus,增加属性很方便呀,简单对象,只用改实体。至于其他需要手写 sql 的地方,你用其他方式也肯定要改 sql 语句的。
    sagaxu
        42
    sagaxu  
       2020-09-25 16:51:23 +08:00 via Android
    @BBCCBB XML 拼 SQL 体验太差了,相比写代码而言

    没有少写代码,SQL 还是那个长度
    没有提高性能,增加了解释 XML 的开销
    代码和逻辑分离,不利于读旧代码
    降低了灵活性,某些场景下还很麻烦

    现在 mybatis 有点几年前 ssh 那味儿
    Cbdy
        43
    Cbdy  
       2020-09-25 16:52:41 +08:00
    为什么不直接写 SQL ?
    yuxing1171
        44
    yuxing1171  
       2020-09-25 16:58:54 +08:00
    这没有喜欢不喜欢吧,看项目实际情况决定,没有哪个更好,只有更合适。
    20150517
        45
    20150517  
       2020-09-25 17:22:24 +08:00
    jooq
    TelltoLies
        46
    TelltoLies  
       2020-09-25 17:27:11 +08:00
    手写 sql 不香么?
    zhaoyuting
        47
    zhaoyuting  
       2020-09-25 17:39:24 +08:00
    同以上 JdbcTemplate
    orm
        48
    orm  
       2020-09-25 17:55:11 +08:00 via Android
    JPA
    zhady009
        49
    zhady009  
       2020-09-25 18:15:05 +08:00
    @sagaxu 一般的条件 IDEA 插件自动生成 只有很特殊的才要写
    hankli
        50
    hankli  
       2020-09-25 18:41:03 +08:00
    能用 JPA 为啥要用 mybatis
    sagaxu
        51
    sagaxu  
       2020-09-25 18:44:06 +08:00 via Android
    @zhady009 idea 插件能自动生成的,JPA 根据接口的方法签名自动合成 SQL 了
    BBCCBB
        52
    BBCCBB  
       2020-09-25 18:47:10 +08:00
    @sagaxu 但写代码拼 sql 更麻烦呀. 像 mybatis 的 where, set 等标签能解决里面一个条件都不成立却多了一个 where, set 语句这种问题. 拼代码有点麻烦.
    像 mybatis-plus 这种解决了大部分场景, 剩下的就是用 xml 或者注解写 sql 搞定.
    sagaxu
        53
    sagaxu  
       2020-09-25 18:58:02 +08:00 via Android
    @BBCCBB 代码手拼也可以封装几个 helper 方法啊,有了 lambda 之后封装简便了很多
    lxk11153
        54
    lxk11153  
       2020-09-25 19:09:56 +08:00
    @FanError #36 ActiveRecord 是啥?
    lau52y
        55
    lau52y  
       2020-09-25 21:14:43 +08:00 via iPhone
    @gowk +1
    FanError
        56
    FanError  
       2020-09-25 21:40:15 +08:00
    @lxk11153 https://javalite.io/activejdbc N 年前 ROR 里的概念
    echo1937
        57
    echo1937  
       2020-09-25 21:45:47 +08:00
    喜欢 JPA > mybatis > mybatis-plus
    rockyou12
        58
    rockyou12  
       2020-09-25 22:30:23 +08:00
    JPA 加 QueryDSL
    hhyyd
        59
    hhyyd  
       2020-09-25 22:40:30 +08:00
    jpa+querydsl
    yema50
        60
    yema50  
       2020-09-26 00:44:41 +08:00 via iPhone
    @NeverNot 貌似 jpa 也可以直接写 sql 啊 ,@Query 里写联表查询
    tohuer00
        61
    tohuer00  
       2020-09-26 02:47:34 +08:00
    我在想是不是现在的小朋友都不会写 sql 了 所以 jpa 这种东西才会这么热
    jeffh
        62
    jeffh  
       2020-09-26 07:37:36 +08:00
    mybatis plus
    tydl
        63
    tydl  
       2020-09-26 08:57:09 +08:00
    PHP 是最好的语言~~~~~~~
    tsingke
        64
    tsingke  
    OP
       2020-09-26 09:06:10 +08:00 via iPhone
    @tydl 兄弟 时代变了 php 要黄了
    yinzhili
        65
    yinzhili  
       2020-09-26 09:33:28 +08:00
    一开始功能简单的时候 jpa 可以节省开发时间,但我觉得如果项目规模慢慢扩大,对于复杂的报表需求又不得不用 mybatis 。所以为什么不干脆一开始就选用 mybatis 呢?
    xuanbg
        66
    xuanbg  
       2020-09-26 09:38:30 +08:00
    @sagaxu
    @a719031256

    现在都是这种注解写法吧……

    @Results({@Result(property = "detail", column = "detail", javaType = Object.class, typeHandler = JsonTypeHandler.class)})
    @Select("<script>select a.id, e.`name` as entity, a.type, a.`code`, a.`name`, a.balance, a.detail, a.is_invalid " +
    "from iaf_account a join iab_entity e on e.id = a.entity_id where e.tenant_id = #{tenantId} " +
    "<if test = 'key != null'>and (type = #{type} or `code` = #{key} or name like concat('%',#{key},'%')) </if>" +
    "order by created_time desc</script>")
    List<AccountDto> getAccounts(QueryDto dto);

    压根不需要 xml
    anguiao
        67
    anguiao  
       2020-09-26 09:41:39 +08:00 via Android
    @xuanbg 对 mybatis 来说,没觉得注解和 xml 比起来有什么优势。
    KV2
        68
    KV2  
       2020-09-26 09:45:15 +08:00
    jpa+jdbcTemplate
    rb6221
        69
    rb6221  
       2020-09-26 09:46:32 +08:00 via iPhone
    我写过一个项目挺复杂,用的 jdbc
    securityCoding
        70
    securityCoding  
       2020-09-26 09:56:22 +08:00
    jpa
    18258226728
        71
    18258226728  
       2020-09-26 10:22:42 +08:00
    mybatis-plus,啥也不想,小项目也用这个,总是会出现 sql jpa 搞不了
    MarioLuo
        72
    MarioLuo  
       2020-09-26 12:11:53 +08:00 via Android
    项目用的 spring-data-mongo, 其中 CRUD 方法、分页排序、方法名的查询、注解条件甚是方便、SpringData 系列互通,人生苦短何不一试。
    zmxnv123
        73
    zmxnv123  
       2020-09-26 12:14:25 +08:00
    我选择 SQlAchemey...
    MarioLuo
        74
    MarioLuo  
       2020-09-26 12:23:30 +08:00 via Android
    @rockyou12 query dsl 代码生成每次都需要手动触发 compile, 这个怎么弄?而且为了少数查询需求生成这么多代码感觉有点重
    rockyou12
        75
    rockyou12  
       2020-09-26 12:57:42 +08:00
    @MarioLuo 我写的时候反正没有需要 compile 的问题,可能因为我项目都是用的 gradle……
    wangyanrui
        76
    wangyanrui  
       2020-09-26 16:20:08 +08:00 via Android
    简而言之,面相对象和面相过程的 PK
    简单业务逻辑,写到 service 中,选哪个无所谓
    复杂业务逻辑,想要 ddd,选 jpa
    chenhui7373
        77
    chenhui7373  
       2020-09-26 17:43:13 +08:00
    @18258226728 印象可以这样?@Query(native=true,value="SQL_PLACEHOLDER")
    chenhui7373
        78
    chenhui7373  
       2020-09-26 17:44:05 +08:00
    r2dbc 貌似 jpa 友好
    yalin
        79
    yalin  
       2020-09-26 17:44:40 +08:00
    jpa
    yalin
        80
    yalin  
       2020-09-26 17:55:21 +08:00
    微服务的 cqrs 架构
    KevinBlandy
        81
    KevinBlandy  
       2020-09-26 19:43:30 +08:00
    Jpa + QueryDsl (一年多没用过 mybatis 了)
    ourslay
        82
    ourslay  
       2020-09-26 21:29:50 +08:00 via iPhone
    spring data jdbc + mybatis 这个应该是最佳组合了吧
    ajaxpost
        83
    ajaxpost  
       2020-09-26 22:07:13 +08:00 via iPhone
    QueryDSL 会受到 Entity 里的 OneToOne,OneToMany 封注解得影响,有时候 left join 变 cross join,大家咋解决的?不写导航属性么
    fpure
        84
    fpure  
       2020-09-27 00:29:07 +08:00
    我宁可用 spring jdbctemplate 也不想用 jpa,项目中用过要多难受有多难受。jpa 擅长的自然好写,jpa 不擅长的实现起来就想撞墙,所以对我而言 jpa 并不是一个可以放心全部托付的框架。现在许多 mybatis 二次开发的框架单表也不用写 sql 了,同时具有 jpa 的简单和 mybatis 的灵活,不香吗?
    fpure
        85
    fpure  
       2020-09-27 00:36:56 +08:00
    话说楼主提到的这个 mybatis-dynamic-sql 有点意思,有 mybatis-plus 等库的感觉了,而且是官方出的,关注了
    fpure
        86
    fpure  
       2020-09-27 00:39:45 +08:00
    不知道为什么我居然没有关注过官方的这个库
    gitdoit
        87
    gitdoit  
       2020-09-27 08:55:16 +08:00
    都用过,还是觉得 mybatis plus 好用,单表操作用 AR 模式,多表直接写 xml
    zppass
        88
    zppass  
       2020-09-27 10:42:51 +08:00
    咱自有国情,mybatis 可以自己定制 SQL 业务逻辑,只不过太多逻辑冗余进去,特别复杂特别久远 SQL 代码都不敢碰,改一点就缺点东西多点东西出来,甚至部分条件失效。
    JPA 没怎么用过,听过名字,在想会不会是那种 hibernate 的继承者的啥的,也不好说啥。
    magen
        89
    magen  
       2020-09-27 11:25:57 +08:00
    我选择在 SpringBoot 里引入 JFinal 的 Record 模块,Db.use("A 库").find("select * from XX where DATA_DT=?",'20200926');

    做报表时,这个写法太舒服了
    pkupyx
        90
    pkupyx  
       2020-09-27 17:46:38 +08:00
    多数 hibernate,少数 mybatis-plus
    喜欢继承 mp 的 interface,简单的用 baseMapper 的查询,复杂的注解写 SQL 。整体比 h 省心且直观。
    不喜欢 mp 的 @Select 语句无法变色高亮检查,code review 会坑。

    另外 mp generate 的 entity 结构竟然不是标准 JPA 规范的,很烦。
    751762476
        91
    751762476  
       2020-09-27 18:19:51 +08:00
    ktorm 了解下
    sayhi
        92
    sayhi  
       2020-09-27 18:39:16 +08:00 via Android
    jpa querydsl
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2663 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 02:26 PVG 10:26 LAX 19:26 JFK 22:26
    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