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

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

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

    很简单举了例子说:一个数据库如果有 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 等的支持也相当不错。

    MyBatis 我永远都不会再选择。 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   ·   我们的愿景   ·   实用小工具   ·   5818 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:55 · PVG 09:55 · LAX 18:55 · JFK 21:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.