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

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

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

    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
    janus77
        69
    janus77  
       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   ·   实用小工具   ·   2872 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.