今天和面试官聊到 DAO 层时,面试官表示 JPA 很反人类 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Camile
V2EX    Java

今天和面试官聊到 DAO 层时,面试官表示 JPA 很反人类

  •  1
     
  •   Camile 2016-11-23 16:29:20 +08:00 42169 次点击
    这是一个创建于 3252 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很简单举了例子说:一个数据库如果有 50 个字段,那你写各种条件查询不是要写很多?就是应该用类似 SQL 的方式来查询啊。(感觉是挺 MyBatis 派 or 喜欢写 HQL

    但是事实情况似乎并不是如此,我认为 JPA 很好用开发效率很高,最多就是打日志的时候 SQL 有点恶心。

    各位是怎么看的?

    47 条回复    2018-01-25 16:39:18 +08:00
    jsou
        1
    jsou  
       2016-11-23 17:01:04 +08:00
    从来不用 JPA.不要让简单的事情变复杂.
    有学习 JPA 的时间,能封装好几套 ORM 框架出来了.
    shoaly
        2
    shoaly  
       2016-11-23 17:15:38 +08:00
    jpa 这种在 数据写入的时候 可读性很高
    数据查询的时候 一般普通查询 可读性也很高, 连表查询也很优雅
    复杂查询的时候 我还是喜欢 sql
    Camile
        3
    Camile  
    OP
       2016-11-23 18:33:07 +08:00   1
    @jsou ...是吗?我觉得 JPA 还算简单的
    eamon666
        4
    eamon666  
       2016-11-23 18:57:04 +08:00
    那么 JPA 是什么
    guoziyan
        5
    guoziyan  
       2016-11-23 19:00:22 +08:00
    JPA 可以结合 sql 语句的 。使用 @Query 注解
    shakala
        6
    shakala  
       2016-11-23 19:01:15 +08:00
    使用 Mybatis 的路过。。。表示不知道 JPA 怎么玩
    EXE
        7
    EXE  
       2016-11-23 19:12:41 +08:00
    Jpa 多表操作就傻眼了
    zacard
        8
    zacard  
       2016-11-23 19:21:19 +08:00
    也没到反人类的地步,有时候挺好用的。
    murmur
        9
    murmur  
       2016-11-23 19:28:59 +08:00
    Mybatis 对于稍微会写 sql 的都没问题
    caixiexin
        10
    caixiexin  
       2016-11-23 19:30:32 +08:00 via Android
    多表查询时怎么办呢,复杂 SQL 语句怎么办呢,让 dba 优化 SQL 的时候怎么办呢。
    每次用这类 orm 框架,碰到复杂的业务头就痛。
    还是 mybatis 能直接看到 SQL 语句舒服。。
    Camile
        11
    Camile  
    OP
       2016-11-23 19:33:14 +08:00
    @eamon666 可以具像理解为 Hibernate 吧..因为 JPA 就是一个标准
    @guoziyan 那个应该是 HQL 了吧?
    @EXE 写 HQL 可破吧..
    @zacard 是的。所以有点楞逼
    @murmur 想起以前面试时当面给写复杂 SQL ,瞬间 SB 了
    Lpl
        12
    Lpl  
       2016-11-23 19:34:01 +08:00
    多表操作用 queryDsl ,单表操作一般就是 JPA 。比如: public List<User> findByNameLikeOrderByIdDESC(name, orderBy)。
    Camile
        13
    Camile  
    OP
       2016-11-23 19:34:23 +08:00
    @caixiexin 不是可以写 HQL 吗? dba 优化倒的确是一个痛点
    jsou
        14
    jsou  
       2016-11-23 19:36:30 +08:00   1
    @Camile 复杂是指的过度设计.

    从 jdbc->jdbctemplate->hibernation/mybatis 再到 jpa,真当开发人员的学习时间不要钱.

    我觉得到 h/m 这一级的封装已经有点过了,再往深处走就有病了.

    自己写个 orm 框架,几千行代码,多表\级联\校验\注解\日志\代码生成之类的都能实现了,还能按项目特性去保障性能.
    就我自己做过的项目来说,会依据数据库可能出现的最坏场景,然后对我们自己写的 orm 框架进行一些微调,想怎么改就怎么改.用那些重量级框架,特殊需求满足不了\不小心出个 bug 能干翻 99%的开发人员\遇到性能问题都没处说理去.
    Camile
        15
    Camile  
    OP
       2016-11-23 19:39:30 +08:00
    @jsou 造轮子的人值得钦佩
    caixiexin
        16
    caixiexin  
       2016-11-23 19:39:37 +08:00 via Android
    @Camile 主要用 hql 的话,我觉得还不如直接上 mybatis 了,起码开发的时候代码中的 SQL 语句复制粘贴出来改下参数就能用了,放到 MySQL 中调试也方便。
    jpa 或 hibernate 这类 orm 框架,团队中没有一个懂得多的大牛的话,感觉暗抗很多的。
    Camile
        17
    Camile  
    OP
       2016-11-23 19:46:44 +08:00
    @caixiexin 你说得也有一定的道理
    greatghoul
        18
    greatghoul  
       2016-11-23 19:50:33 +08:00
    @caixiexin 相比 JPA ,我觉得真正懂 SQL 的人更少。
    zonghua
        19
    zonghua  
       2016-11-23 21:37:46 +08:00 via iPhone
    @caixiexin 但事实上 xml 里面的语句写了一大堆套件判断
    eriale
        20
    eriale  
       2016-11-23 21:47:13 +08:00
    JPA 在最基本的 CRUD 场景下很好用,如果是跟 Spring boot 一起用,上手非常快。
    前几天看到一个技术博客推荐的 mybatis 自动 sql 生成: https://piaoniu.io/pndaokai-yuan-liao/,提供的功能也就是 JPA 的子集。
    Miy4mori
        21
    Miy4mori  
       2016-11-24 03:19:25 +08:00 via Android   1
    纯用 jpa 是挺麻烦的,但是很 oo ,这就导致有些人懒得学懒得看,所以 jpa 不受待见……
    georgema1982
        22
    georgema1982  
       2016-11-24 08:50:42 +08:00
    @jsou 想法很天真。你觉得你自己开发的 orm 框架将来不需要维护吗?维护不需要成本吗?如何保证性能和正确性?我用过一些公司自己的设计的 orm 框架,比开源 orm 框架难用不说,还有各种资源泄露的严重系统级 bug 。
    imcj
        23
    imcj  
       2016-11-24 09:12:28 +08:00 via iPhone
    @jsou 故意找喷的?无脑装逼
    jsou
        24
    jsou  
       2016-11-24 09:24:24 +08:00
    @georgema1982 如何保证性能和正确性这个问题用在开源 orm 上也一样合适,回答不了,我只能说自己写的代码可掌控程度高一点.

    @imcj orm 框架不像 spring,orm 只是面对数据持久化,没多少知识点,要装也不用这个装.已 block(v2 好像流行这个?)
    LancerXin
        25
    LancerXin  
       2016-11-24 10:12:08 +08:00
    这个问题就像月经帖一样 每个月都会被提那么几次。
    gowk
        26
    gowk  
       2016-11-24 10:25:19 +08:00 via Android
    用过,不太喜欢,可能功力不够,还是喜欢 Mybatis ,不过 JPA 规范那套接口设计的真他妈漂亮...
    ericls
        27
    ericls  
       2016-11-24 10:28:11 +08:00
    我觉得用 DSL 是个很好的平衡
    markme
        28
    markme  
       2016-11-24 11:25:37 +08:00
    JPA 这种标准只适合写 DEMO ,当然你也可以通过各种方式去实现多表复杂查询,但是为什么不用 Mybatis ?
    yeyuexia
        29
    yeyuexia  
       2016-11-24 11:33:11 +08:00
    233 这个时候可以推一下我们自己搞的一个基于 jpa 的封装了,大家有兴趣可以来试试嘛. 不过目前该框架只是对 query 进行封装,并不支持 join 查询。
    https://github.com/elvis-liu/yaz
    chocotan
        30
    chocotan  
       2016-11-24 12:24:01 +08:00
    跟楼主想法一样, JPA 很好用开发效率很高,且无需关心底层数据库
    但是遇到要优化 sql 的时候就.....我水平不够

    在国内貌似很不受待见+1 ,不知道国外是怎么样的 ,以前看 youtube 上的 spring boot 讲座的时候,也是用的 jpa 呀
    mybatis 可以用 mybatis-generator 生成 mapper ,缺点是生成的代码太多了,且数据库有变动的时候需要重新生成,自从用了这个后很少写 sql 语句了
    imxiaozhi
        31
    imxiaozhi  
       2016-11-24 12:41:09 +08:00
    其实 jpa 还是挺方便的,也可以自定义复杂 sql
    leopku
        32
    leopku  
       2016-11-24 13:02:17 +08:00   2
    慈禧第一次听说轮船不用牛拉的时候,认为那玩意真 TM low
    ZiLong
        33
    ZiLong  
       2016-11-24 13:19:52 +08:00
    @leopku 哈哈,给你一百个赞
    sampeng
        34
    sampeng  
       2016-11-24 15:16:05 +08:00
    sql 的全称是什么?请大声读出来!!!
    danngo2455
        35
    danngo2455  
       2016-11-24 15:52:51 +08:00
    JOOQ 是一个很好的平衡点
    teemoer
        36
    teemoer  
       2016-11-25 09:39:24 +08:00
    ![]( )

    ![]( )

    啪啪啪
    georgema1982
        37
    georgema1982  
       2016-11-26 04:50:23 +08:00
    @jsou 如果对“性能和正确性”的回答是“不知到”的话,这已经足够说明用自己所谓控制性高的自制框架的问题所在了
    jsou
        38
    jsou  
       2016-11-26 15:08:26 +08:00
    @georgema1982 性能和正确性这个问题,你去问任何一个框架,谁能三言两语的回答了.没有生产环境的检验,说明不了什么.
    仅就 hibernate/mybatis 来说:
    性能就从来不和 hibernate 搭边,对 hibernate 也不多说什么,我从参加工作开始,公司的所有项目选型中没人考虑过它;
    mybatis 我也有在项目中用过,遇到最让我记忆深刻的问题就是一样的数据,一样的代码,在批量 insert 的时候当数据量到一定程度时,oracle10g 上报错,oracle11g 正常,手工执行 sql 没任何问题.一行一行调试源码找到问题所正,花掉的时间能打两场麻将了.

    虽然造轮子一开始是浪费时间,但当遇到底层框架 bug 时,怎么可能有自己写的更得心应手.
    当然我是指那些功能域单一的"小框架".像 spring 这种,没能力动它,只能乖乖的被它上.

    不少[功能域单一的"小框架"]我所在的项目团队宁愿自己造轮子,也不愿再跳它们的坑,不仅仅是 orm.比如像:mina 遇到 cglib,atmosphere 遇到 weblogic,shiro 遇到静态化.没踩坑的时候总觉得它们千般好,踩过坑后,被它们浪费的时间,一个轮子造好了.

    乐此不疲的造轮子的人都是从坑里爬出来的.
    q397064399
        39
    q397064399  
       2016-11-30 14:47:58 +08:00
    @jsou 小项目都自己造轮子,老板的开发成本 瞬间上升啊
    q397064399
        40
    q397064399  
       2016-11-30 14:49:10 +08:00
    @jsou 不过 Hibernate 确实太重了,学习起来成本太高了,只用 JPA 实现一些多表的功能又十分麻烦
    q397064399
        41
    q397064399  
       2016-11-30 15:06:49 +08:00
    @jsou Struts2 用的多么?
    niweicumt
        42
    niweicumt  
       2016-12-16 17:20:27 +08:00
    口味选择啦,话说我也比较倾向 MyBatis
    hantsy
        43
    hantsy  
       2016-12-19 12:36:25 +08:00   1
    JPA 几乎是我所有 Java EE 项目中作为 Persistence 的首选。

    @danngo2455 JOOQ 对 JDBC 操作来讲不错,在一些场合我也会用到。另外就是 QueryDSL 的对纯 SQL / JPA 等的支持也相当不错。

    MyBati 我永远都不会再选择。 Batis 在进入 Apache 前用过一次(当然 Batis 后来在 Apache 呆不住了),还不如 Spring Jdbc Template 简洁,为什么要用它?

    开发时我们要考虑:

    1. OOP 首先必须满足面向对象的要求,而不是要面向数据库。
    2. 最近几年的项目,都是必须满足 Typesafe 查询,这些在 Hibernate , JPA , JOOQ , Query DSL 都支持得很好。
    3. 权衡数据库和 OOP 对象设计。

    问过身边一些使用 MyBatis 的人,为什么喜欢它?理由很简单,只会一点 SQL , MyBatis 拿就可以上手。一个共同点,没系统的学习过 Java 和 Java EE ,大多数连 Oracle 官方的 Java 和 Java EE 教程都没读过,更不说是读一本完整的书去系统学习知识,好不用说系统学习 JPA 了,平时写代码也就是只会一些 Copy 的工作。
    Camile
        44
    Camile  
    OP
       2016-12-20 09:28:47 +08:00
    @hantsy 2333 后面黑的太厉害了
    hantsy
        45
    hantsy  
       2016-12-20 12:06:23 +08:00
    @Camile 不是黑,最近帮朋友公司面试一些不少人,只会 Copy 代码的见得太多了。

    以上回复也可以看出一些,如果你用 JPA 还在关心表,,,呵呵,基本上说明在滥用 JPA 了。
    zonghua
        46
    zonghua  
       2016-12-24 01:40:43 +08:00 via iPhone
    @EXE 用多表关联查询本来就会被骂
    ConradG
        47
    ConradG  
       2018-01-25 16:39:18 +08:00
    JPA 随着系统复杂度上升,可读性下降的很快(注解的通病),性能上也并不多亮眼。系统规模小且简单的话属于不错的选择。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5368 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 03:48 PVG 11:48 LAX 20:48 JFK 23:48
    Do have faith in what you're doing.
    ubao msn 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